通过指针变量指向一个二维 int 类型数组元素:
int a[3][5]={
{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; //定义一个数组名为 a 3行5列的整型数组
int (*p)[5]; //定义一个变量名为pa的int类型指针变量。这个指针变量指向一个长度为5的数组,
//pa + 1 就相当于 &a[0][0] + 5,指向下一行的首地址
p=a;
printf("**(p+1) = %d;\n",**(p+1)); // 输出 6
printf("**p+1 = %d;\n",**p+1); // 输出 2
int * pa = (int *)a; //定义一个指向整型变量的指针,这里的 p + 1 就是指向了下一个元素。
printf(" *pa = %d;\n",*(pa+1)); //输出 2
p = &a[0][0]; //让指针变量p指向数组a的a[0][0]元素
p = &a[2][2]; //让指针变量p指向数组a的a[2][2]元素
Note:
在二维数组中数组名表示指针的指针,它是一个指向一维数组的数组名,
int * pa = (int *)a; 因为这里有强制转换符(int *) 因此就将这个指针的指针转成 单纯的int * 类型, 因此 *pa 就是a[0][0]
下面这个就是将数组名直接赋值给一个指向长度为 5 的数组指针
int (*p)[5];
p=a;
因为是地址的地址因此 &a 其实就是获取了一个指向一维数组的指针值, 这个指针值加1 就相当于加了一个一维数组的长度
因为是地址的地址因此 *a 也是一个指针。 **a 才是 a[0][0] 这个元素
指针操作 | 数组操作 | 说明 |
int (*p)[5]; | a | 二维数组名,指向一维数组a[0] 即0行首地址 |
p=a; | a[0] | 0 行 0列元素地址 , a[0][0] 的地址 |
int * pa = (int *)a; | *(a+0) | 0 行 0列元素地址, a[0][0] 的地址 |
int * pa = (int *)a; | *a | 0 行 0列元素地址 |
a + 1 | 第一行首地址 | |
&a[1] | 第一行首地址 | |
a[1] | 1 行 0列元素地址,a[1][0]的地址 | |
*(a + 1) | 1 行 0列元素地址,a[1][0]的地址 | |
a[1] + 2 | 1 行 2列元素地址,a[1][2]的地址 | |
*(a+1)+2 | 1 行 2列元素地址,a[1][2]的地址 | |
&a[1][2] | 1 行 2列元素地址,a[1][2]的地址 | |
*(a[1]+2) | 1 行 2列元素,a[1][2] | |
*(*(a+1)+2) | 1 行 2列元素,a[1][2] | |
a[1][2] | 1 行 2列元素,a[1][2] |