数组指针与指针数组
数组指针(行指针):数组指针只是一个指针变量,C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。
指针数组:指针数组是一个数组,多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
数组指针:定义 int (* p)[n];
指针数组:定义 int *p[n];
优先级为 () > [] > *
比如int (* p)[n],因为()的优先级最高,p先于*结合,所以p是一个指针,后面是数组,于是这个就是数组指针。
在如int * p[n],[]优先级比* 高,p先与[]结合,所以p是一个数组,前边又有*,所以是指针数组。
数组指针:首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
指针数组:[]先与p结合成为一个数组,再由int * 说明这是一个整型指针数组,它有n个指针类型的数组元素。这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
p1为指针数组,p2为数组指针
借鉴的大佬的例子:
数组指针
#include <stdio.h>
int main(void) {
int arrP[5] = {1,2,3,4,5};//定义一个数组并赋值
int (*p)[5] = &arrP;//定义一个数组指针并为其赋值,把这个数组的首地址赋给了数组指针
printf("%p\n",arrP);//数组名为数组首元素的地址 与 &arrP[0] 等价
printf("%p\n",p);//p为arrP的地址 及 &arrP,注意:虽然arrP与&arrP值相同,单代表的意思却不一样,类型却不同。arrP代表首元素的地址,&arrP代表数组的地址。
printf("%p\n",*p);//*p代表arrP,所以这个表示arrP首元素的地址
printf("%d\n",**p);//既然*p代表首元素的地址,**p为求这个地址上的值
printf("%d",(*p)[1]);//*p为arrP,所以(*p)[1]就是arrP[1]的值
return 0;
}
指针数组
#include <stdio.h>
int main(void) {
int x = 100;
int y = 200;
int *p[2];//定义一个指针数组
p[0] = &x;
p[1] = &y;
printf("%p\n",p[0]);//x的地址
printf("%p\n",&x);//x的地址
printf("%d",*p[0]);//x的值
return 0;
}
暂时就写这些,感觉自己对指针的理解还是不够深刻,再去学学指针,以后有新理解再来补充。