指针数组和数组指针是两个不同的概念。
指针数组(Pointer Array)是一个数组,其中的每个元素都是指针。换句话说,指针数组是一组指针的集合。它的声明形式为type *arrayName[size],其中type是指针数组中元素的类型,arrayName是指针数组的名称,size是指针数组中元素的数量。例如,int *ptrArray[5]声明了一个包含5个指向整型数据的指针的数组。
数组指针(Array Pointer)是一个指向数组的指针。它指向数组的首个元素的地址。数组指针的声明形式为type (*pointerName)[size],其中type是数组中元素的类型,pointerName是数组指针的名称,size是数组中元素的数量。例如,int (*ptr)[5]声明了一个指向包含5个整型元素的数组的指针。
区别:
int (a)[10];
由于()的优先级比(解引用)的优先级高,则首先说明p是一个指向整型的一位数组的指针,这个一位数组的长度为10.此时执行p + 1相当于跨过10个长度的整型元素.
即如果将b[3][4]赋值给指针数组,执行a = b;,那么a ++ 也就指向了b[1][]这一行。
所以数组指针是指向一位数组的指针,也称为行指针。
int a[10];
由于[]优先级高,先于a结合形成数组,再由int说明这是一个整型指针数组,它有10个指针类型的数组元素。这里执行a+1时,则a指向下一个数组元素,这样赋值是错误的:a=b;因为p是个不可知的表示,只存在a[0]、a[1]、a[2]...a[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 a=b; 这里a表示指针数组第一个元素的值,b的首地址的值。
如果要二位数组赋值给一指针数组:int a[3],b[3][4];
则执行a++:该语句表示a数组指向下一个数组元素,此数组每一个元素都是指针.
for(i=0;i<3;i++)
a[i]=b[i]
这里int a[3] 表示一个一维数组内存放着三个指针变量,分别是a[0]、a[1]、a[2]
所以要分别赋值。
两者的区别:
数组指针只是一个指针变量,是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。
指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
“[]”的优先级比“*”要高。
B中,“()”的优先级比“[]”高,“*”号和a构成一个指针的定义,指针变量名为a,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚a 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针
C中,a先与“[]”结合,构成一个数组的定义,数组名为a,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。