答:不等同。
int *p[4]是一个指针数组,就是数组里面放的是指针。由于[]比*优先级更高,因此p先与[4]结合,形成p[4]形式,这显然是数组形式,它有4个元素,然后再与p前面的*结合,*表示此数组是指针类型的,每个数组元素(也就是一个指针变量)都可以指向一个整形变量。
*p[4]是指针数组,他是数组。数组里面放的是指针,简单的说定义了4个指针,分别是*p[0] *p[1] *p[2] *p[3],相当于将这四个指针打包到这个数组中
(*p)[4]是数组指针,他是指针并且是一个指向一维数组的指针。因为以行为单位,又称行指针。 通俗点讲,后面的[4]说明他的每行有4个元素,[0]代表第一列的下标,[1]代表第二列的下标,一次类推。(*p)的意思是指针p指向第一行,*(p+1)即指向第二行,同理一次类推。那么*(p+2)[3]的意思即是指一维数组第二行第四列的元素
实例:
void main()
{
int a[3][4] ={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;
p = a;
scanf("i = %d,j = %d",&i,&j);
printf("%d",*(*(p+i)+j));
}
输入i=1,j=2
结果:13
分析
int (*p)[4]表示p是一个指针变量,它指向包含4个整形元素的一维数组。注意*p两侧的()不可缺少。对照下列:(1)int a[4];(a有4个元素,每个元素为整形)‘(2)int (*p)[4](p所指的对象是有4个整形元素的数组,即p是一维数组的指针,应该记住此时p只能指向一个包含4个元素的一维数组,p的值是该一维数组的起始地址。)p->| (*p)[0] | (*p)[1] | (*p)[2] | (*p)[3] |p->| 1 | 3 | 5 | 7 |p+1->| 9 | 11 | 13 | 15 |p+2->| 17 | 19 | 21 | 23 |其中p+i是二维数组的a的i行的起始地址(由于p是指一维数组的指针变量,因此p加1,就指向下一行),那么*(p+2)+3是什么呢?由于p=a,因此*(p+2)就是a[2],*(p+2)+3就是a[2]+3,而a[2]的值是数组a中第3行第0列a[2][0]那么*(*(p+2)+3)就是a[2][3]另外*(p+2)是a数组第3行的首地址,而p+2是a数组第3行的起始地址,二者值相同,那*(p+2)+3能否写成(p+2)+3呢?显然不成,不能做简单的数值替换。(p+2)+3就成了p+5了,是a数组第6行的起始地址。 要注意"*(p+2)+3"括号中的2以一维数组的长度为单位的,即p每加1,地址就增加8个字节(4*2个字节),而"*(p+2)+3"括号外面的3,不是以p所指向的一维数组位长度为单位的。3是以元素的长度为单位的,加3就是加(3x2)个字节。虽然p+2和*(p+2)具有相同的值,但是它们所指向的对象的长度是不同的。
-------------------------------------------------------------------------------------------------