指针数组和数组指针已经算的上是老生常谈的话题了,首先我们得明确一个概念就是,无论是指针数组还是数组指针,其本质上都是二维的。
数组指针
数组指针,其本质是一个指针,特殊点在于其指向一个数组,下面这段代码可能可以让你更好理解一些。
我们定义一个数组指针pa,它可以指向长度为3的整形数组,分别用它来指向
- 一个长度为三的整形数组
- 一个长度为2x3的二位数组
- 一个长度为2x3的二位数组的第二个值
- 一个长度为6的一维数组
- 一个长度为6的一维数组的第二个值的地址
int arr[3] = {0,1,2};
int(*pa)[3] = arr;
printf("%d\n", (*pa)[1]);
printf("%d\n", pa[0][1]);
int arr1[2][3] = { {0,1,2},{3,4,5} };
pa = arr1;
printf("%d\n", (*pa)[1]);
printf("%d\n", pa[0][1]);
pa = arr1[1];
printf("%d\n", (*pa)[1]);
printf("%d\n", pa[0][1]);
int arr2[6] = {0,1,2,3,4,5};
pa = arr2;
printf("%d\n", (*pa)[1]);
printf("%d\n", pa[0][1]);
pa = &arr2[2];
printf("%d\n", (*pa)[1]);
printf("%d\n", pa[0][1]);
运行一下这段代码。
1
1
1
1
4
4
1
1
3
3
pa是一个可以也只能指向长度为三的整形数组的一个指针,pa只是一个指针,pa的长度为4,pa没有空间来存放值,它只能存放一个数组的地址。
当它指向一个数组的时候,它存放的就是这个数组首元素的地址,因此想要通过pa来访问这个数组的时候,就需要使用取值符号*pa来访问,可以通过数组的方式来访问,也可以通过指针的方式来访问。
pa指向的是一个长度为三的数组,但由于数组的地址在空间中是连续的,因此我们可以通过越界的方式来访问超出三这个长度的值,例如:
printf("%d\n", (*pa)[5]);
printf("%d\n", pa[0][5]);
5
5
虽然我们仍旧可以正常访问到我们需要的值,但由于越界操作本身比较危险,因此在使用时依旧建议将数组指针的长度和数组本身的长度匹配起来。
指针数组
指针数组是一个数组,它存放的是指针。
我们定义一个指针数组pa,它是一个长度为2的数组,里面可以存放两个指向整形变量的指针。这两个变量可以是整形变量的地址,也可以是整形数组中的一个变量的地址。
int a = 0, b = 1;
int* pa[2] = { &a,&b };
printf("%d\n",*(pa[0]));
printf("%d\n", pa[0][0]);
printf("--------\n");
int arr1[3] = { 0,1,2 };
int arr2[2] = { 3,4 };
pa[0] = arr1;
pa[1] = arr2;
printf("%d\n", *(pa[1]));
printf("%d\n", pa[0][1]);
printf("%d\n", pa[1][1]);
printf("%d\n", *(*(pa+1)+1));
printf("--------\n");
int arr3[5] = { 0,1,2,3,4 };
pa[0] = arr3;
pa[1] = &arr3[2];
printf("%d\n", *(pa[0]));
printf("%d\n", pa[0][3]);
printf("%d\n", pa[1][1]);
printf("%d\n", *(*(pa + 1) + 1));
printf("--------\n");
0
0
--------
3
1
4
4
--------
0
3
3
3
--------
当pa存放的时一个整形变量的地址时,可以通过取值或者下标的方式访问该变量,当pa存放的时一个整形数组中的一个变量的地址时,由于数组地址的连续性,我们可以通过指针移位的方式或者数组下标的方式来获取相邻其他变量的值。
最后,本文仅为自己的理解方式的呈现,若有疑误欢迎批评指正,若有建议欢迎互相交流。