数组指针和指针数组的区别:
数组指针(也称行指针)
定义 int (*p) [n];
( )的优先级高,首先说明,p是一个指针,指向的元素类型是int [n] ,也就是说这个指针的步长就是一维数组的长度,当执行p + 1时,p要跨过n个长度。
如果将一个二维数组赋给一指针,应这样:
int a[3] [4];
int (*p)[4];//定义一个数组指针,指向元素为int[4] ,即一维数组的指针。
p=a; // 将该二维数组的首地址赋给p,
p++ ; //该语句执行后,p跨过了a[0][ ] 指向a[1] [ ]
所以数组指针也称指向元素为一维数组的指针,已称行指针。
指针数组
定义 int *p[n];
[ ]的优先级高,先与p结合成为一个数组, 再由int * 说明这是一个指针数组,它由n个指针类型的数组元素,它存储的元素类型是int * 。这里执行p+1 是错误的,这样赋值也是错误的:p=a ;因为p是个不可知的表示,只存在p[0], p[1], p[2]....p[n-1],而且它们分别是指针变量用来存储变量地址。但可以这样 *p=a ;这里 *p 表示指针数组第一个元素的值,a的首地址的值。
如何将二维数组赋值给指针数组:
int *p[3] ;
int a[3][4];
for( i =0 ;i <3; i++)
p[i] =a[i];
这里int *p[3] 表示一个一维数组,存放着三个指针变量,分别是p[0] ,p [1], p[2] 所以要分别赋值
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
优先级: ()>[ ] >*
本文是转载于:https://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html ,感谢原作者