答:不等同。
int *p[4]是一个指针数组,就是数组里面放的是指针。由于[]比*优先级更高,因此p先与[4]结合,形成p[4]形式,这显然是数组形式,它有4个元素,然后再与p前面的*结合,*表示此数组是指针类型的,每个数组元素(也就是一个指针变量)都可以指向一个整形变量。
<p>*p[4]是指针数组,他是数组。数组里面放的是指针,简单的说定义了4个指针,分别是*p[0] *p[1] *p[2] *p[3],相当于将这四个指针打包到这个数组中</p> (*p)[4]是数组指针,他是指针并且是一个指向一维数组的指针。因为以行为单位,又称行指针。 通俗点讲,后面的[4]说明他的每行有4个元素,[0]代表第一列的下标,[1]代表第二列的下标,一次类推。(*p)的意思是指针p指向第一行,*(p+1)即指向第二行,同理一次类推。那么*(p+2)[3]的意思即是指一维数组第二行第四列的元素
</pre><pre class="replyask-text" id="content-23459738" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; padding: 0px; font-family: Arial; zoom: 1; line-height: 24px; background-color: rgb(255, 252, 246);">实例:
void main()
{
<span style="white-space: pre;"> </span>int a[3][4] ={1,3,5,7,9,11,13,15,17,19,21,23};
<span style="white-space: pre;"> </span>int (*p)[4],i,j;
<span style="white-space: pre;"> </span>p = a;
<span style="white-space: pre;"> </span>scanf("i = %d,j = %d",&i,&j);
<span style="white-space: pre;"> </span>printf("%d",*(*(p+i)+j));
<span style="white-space: pre;"> </span>
}
输入i=1,j=2
结果:13
</pre><pre class="replyask-text" id="content-23459738" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; padding: 0px; font-family: Arial; zoom: 1; line-height: 24px; background-color: rgb(255, 252, 246);">分析
<pre class="replyask-text" id="content-23459738" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; background-color: rgb(255, 252, 246); padding: 0px; font-family: Arial; zoom: 1;">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] |
</pre><pre class="replyask-text" id="content-23459738" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; background-color: rgb(255, 252, 246); padding: 0px; font-family: Arial; zoom: 1;">p->| 1 | 3 | 5 | 7 |
p+1->| 9 | 11 | 13 | 15 |
<pre class="replyask-text" id="content-23459738" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; background-color: rgb(255, 252, 246); padding: 0px; font-family: Arial; zoom: 1;">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)具有相同的值,但是它们所指向的对象的长度是不同的。
-------------------------------------------------------------------------------------------------
<pre class="reply-text mb10" id="content-811319562" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 10px; padding: 0px; font-family: Arial; zoom: 1;">这是一个数组指针,指向对象是这个数组; 示例: static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定义二维数组m并初始化*/ int (*p)[4];//数组指针 p是指针,指向一维数组,每个一维数组有4个int元素 int i,j; p=m; //p是指针,可以直接指向二维数组 printf("--数组指针输出元素--\n"); for(i=0;i<3;i++)/*输出二维数组中各个元素的数值*/ { for(j=0;j<4;j++) { printf("%3d ",*(*(p+i)+j)); } printf("\n"); }