int *p[]
[]优先级高于*,所以p先是一个数组,然后数组每个元素的类型是int*, int *p[]是一个(int *)类型的指针数组,p本质上是一个数组;
int (*p)[]
()优先级高于[],所以p先与*结合,是一个指针,指针的类型是一个int[]数组,int (*p)[]是一个数组指针,p本质上是一个指针。
#include <stdio.h>
int main(void)
{
printf("=====int (*p)[]=====\n");
int a[2][3] = {{1, 2, 3},{4, 5, 6}}; //C/C++没有多维数组,实质上是数组的数组;
//a先是一个维度为2的数组,该数组每一个元素又是维度为3的数组。
int (*p)[3] = a; //p是指向维度为3的数组的指针,a转化为指向int[2]数组第一维的指针,
//第一维是维度为3的数组。
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
printf("*(*(p+%d)+%d)=%d\n", i, j,*(*(p + i) + j)); //*(p+i)等于a[i]
//(*(p+i)+j)等于(a[i])[j],即a[i][j]
printf("=====int *q[]=====\n");
int b[4] = {11, 22, 33, 44};
int c[4] = {55, 66, 77, 88};
int *q[2]; //q是指针的数组,注意此处数组维度为2,而不一定要是4
*q = b; //*q即*(q+0),也即q[0],即第一个指针,指向数组b
*(q + 1) = c; //*(q+1),即q[1],即第二个指针,指向数组c
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++) {
printf("*(*(q+%d)+%d)=%d\n", i, j, *(*(q + i) + j));
}
}
return 0;
}
输出结果为:
=====int (*p)[]=====
*(*(p+0)+0)=1
*(*(p+0)+1)=2
*(*(p+0)+2)=3
*(*(p+1)+0)=4
*(*(p+1)+1)=5
*(*(p+1)+2)=6
=====int *q[]=====
*(*(q+0)+0)=11
*(*(q+0)+1)=22
*(*(q+0)+2)=33
*(*(q+0)+3)=44
*(*(q+1)+0)=55
*(*(q+1)+1)=66
*(*(q+1)+2)=77
*(*(q+1)+3)=88