1. 指针数组和数组指针
- 指针数组:是一个数组,装着指针的数组 int *p[2]
- 数组指针:是指针,指向数组的指针 int (*p)[2]
2. 优先级: ()>[]>*
- (*p)[n]: 先看括号内,p是一个指针,这个指针指向一个一维数组数组长度为n,这是数组的指针,即数组指针
- p[n] : 根据优先级,先看[],则p是一个数组,再结合,这个数组的元素是指针类型,共n个元素,即指针数组
3. 一个非常好的例子:
3.1 一维数组
void test()
{
int a[5]={1,2,3,4,5};
int (*p)[5]; //数组指针,数组里面有5个元素
p=&a; //数组a的地址赋值给p,则p为a数组的地址,则*p表示数组a本身
//%p输出地址
//在c中,数组名的值是个指针常量,也是数组第一个元素的地址,
//它的类型取决于数组元素的类型
printf("%p\n",a); //输出数组名,一般用数组的首元素地址来标示一个数组,
//输出数组首元素的地址
printf("%p\n",p); //p为数组a的地址,输出数组a的地址
printf("%p\n",*p); //*p标示数组a本身,用首元素标示一个数组
printf("%p\n",&a[0]);
printf("%p\n",p[0]);//数组首元素的地址
printf("%d\n",**p);//*p为数组本身,即数组a首元素地址,则**p为其值
printf("%d\n",*p[0]);//根据优先级,p[0]标示首元素地址,*(p[0])标示首元素本身
printf("%d\n",*p[1]);//为一个绝对值很大的负数
}
结果:
0x7fff4f4b69d0
0x7fff4f4b69d0
0x7fff4f4b69d0
0x7fff4f4b69d0
0x7fff4f4b69d0
1
1
32767
3.2 二维数组
void test()
{
//二维数组
int a[2][3]={{0,1,2},{3,4,5}}; //两行三列
int (*p)[3];//p是数组指针,指向含有三个元素的一维数组
int *q[2];//指针数组,一个数组内存放两个指针变量
p=a;
q[0]=a[0];
q[1]=a[1];
printf("%d\n",a[1][2]);//5
printf("%d\n",*(p[1]+2));//5
printf("%d\n",*(*(p+1)+2));//5
printf("%d\n",(*(p+1))[2]);//5
printf("%d\n",p[1][2]);//5
printf("%d\n",*(q[1]+2));//5
printf("%d\n",*(*(q+1)+2));//5
printf("%d\n",(*(q+1))[2]);//5
printf("%d\n",q[1][2]);//5
}
参考
https://blog.csdn.net/u013719339/article/details/80563247