初学指针和数组这块内容,相信很多人和我一样,都是学着学着就懵逼。而频繁出现的概念如指针数组,数组指针等往往会让初学者们容易混淆,那么我们现在就对这些概念做一个浅显的讲解。由于是初学小白,不足之处欢迎大家批评指出。
指针数组vs数组指针
指针数组 ----元素为指针的数组;它的本质是一个数组,其中的元素为指针
数组指针 ----是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动)
下面借助图来加深理解:
指针数组
定义:int *p[n];
“[ ]”的优先级比“*”高。所以p先与“[ ]"结合,构成一个数组的定义,数组名为p,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量,int表明其类型为整型。
例:int*p[5];
数组指针
定义: int (*p)[n];
“( )”优先级比“[ ]"高,"*"和p构成一个指针的定义,指针变量名为p,int修饰整个数组中的内容。数组在这里并没有名字,是个匿名数组,它的长度是n,注意在执行p+1时,p要跨过n个整型数据的长度。
例: int(*p)[5];
举一个例子来揭示它们的区别:
如要将二维数组赋给一指针数组:
int *p[5];
int a[5][6];
for(i=0;i<5;i++)
p[i]=a[i];
这里int *p[5] 表示一个一维数组内存放着五个指针变量,分别是p[0]、p[1]、p[2]、p[3]、p[4] 所以要分别赋值。
如要将二维数组赋给一指针,应这样赋值:
int a[5][6];
int (*p)[6]; //定义一个数组指针,指向含6个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,即a[0]或&a[0][0]
p++; //该语句执行过后,此时p所指向的是下一行,即a[1][ ]
所以数组指针也称指向一维数组的指针,亦称行指针。
综上,指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间;而数组指针只是一个指针变量,它占有内存中一个指针的存储空间。