指针数组和数组指针

指针数组和数组指针

  • 指针数组:数组的每一个元素都是指针,故所占内存的小和机子位数有关。
  • 数组指针:数组的指针,即指向一个数组的指针就是数组指针,一般对应的是二维数组。

具体就不细说了,主要是分得清,不要弄混了,直接看下面的例子

例子

#include<iostream>

using namespace std;

int main()
{
	//定义数组
	int arr1[3];
	int arr2[3][10];

	//数组指针
	int *p1 = arr1;
	int(*p2)[10] = arr2;

	//首地址
	cout << arr1 << " " << p1 << " " << &arr1[0] << " " << &p1[0] << endl;
	//第二行的首地址
	cout << arr1 + 1 << " " << p1 + 1 << " " << &arr1[1] << " " << &p1[1] << endl;

	//首地址
	cout << arr2 << " " << p2 << " " << p2[0] << " " << &p2[0][0] << endl;
	//第二行的首地址
	cout << arr2 + 1 << " " << p2 + 1 << " " << p2[1] << " " << &p2[1][0] << endl;
	//arr2[1][1]的地址
	cout << arr2[1] + 1 << " " << p2[1] + 1 << " " << &p2[1][1] << " " << &(*(*(p2 + 1) + 1)) << endl;

	//指针数组,下面三种写法效果一样
	int *(n1[10]); //指针大小32位机为4,64位机为8
	int *(n2)[10];
	int *n3[10];

	cout << sizeof(n1) << " " << n1 << " " << n1 + 1 << " " << &n1[2] << endl;
	cout << sizeof(n2) << " " << n2 << " " << n2 + 1 << " " << &n2[2] << endl;
	cout << sizeof(n3) << " " << n3 << " " << n3 + 1 << " " << &n3[2] << endl;

	system("pause");
	return 0;
}

运行结果:

区别和相关用法如上,可对比查看。

再举个例子

#include <iostream>
using namespace std;
int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int*)(&a + 1);
    cout << *(ptr - 1) << "\t" << *(ptr - 2) << endl; // 5 4
    cout << &a + 1 << " " << *(&a + 1) << " " << &a[5] << endl;
    cout << "----------------" << endl;
    int *p = (int *)(a + 1);            //2
    cout << *p << endl;
    return 0;
}

运行结果:

这里的数组指针指向的是一维数组,主要是&aa要分清:

1.a是数组名,是数组首元素地址,+1表示地址值加上一个int类型的大小,如果a的值是0x00000001,加1操作后变为0x00000005*(a + 1) = a[1]
2.&a是数组的指针,其类型为int(*)[5](就是前面提到的数组指针),其加1时,系统会认为是数组首地址加上整个数组的偏移(5个int型变量),值为数组a尾元素后一个元素的地址。

更多

1.指针数组与数组指针详解
2.让你不再害怕指针——C指针详解(经典,非常详细)

posted @ 2019-09-13 23:49  煊奕  阅读(2328)  评论(0编辑  收藏  举报