求问大神,指针为什么&(*(a+1)+2)出错,&*(a+i)表示第i行首地址,为什么加了列以后却报错

求问大神,指针为什么&(*(a+1)+2)出错,&*(a+i)表示第i行首地址,为什么加了列以后却报错

前提是a是一个二维数组吧

a+i 表示的是表示第i行首地址,

*(a+i)表示第i行首元素的地址

在 &*(a+i) 也就是 &(* (a+i) ) 中,&和* 相当于相互抵消了。

而 &(*(a+1)+2)出错,是因为这个类推并不对应。要对应的话,见下图

 int i=1,j,x,y,z,w;
 char a[3][80], *p,(*pp)[80];
 pp = a+i;
 pp = &(*(a+i));
 p = *(a+1)+2;
 p = &(*(*(a+1)+2));

上面的表达式都是没有问题的;

追问

我就是想知道为什么不对应,能否告知我其中的原理

追答

a作为一个二维数组,a+i 表示的是表示第i行首地址,*(a+i)也就代表了二维数组中编号为i的这个一维数组,&*(a+i) 也就是取这个一维数组的首地址,也就是a+i; 同时*(a+i)作为一个一维数组,也是这个数组中的下标为0的元素的地址,*(a+i)+2也就是数组中下标为2元素的地址了。

&(*(a+1)+2)这个不对,是因为&一定要作用于一个具体数据对象, 才能取到它的地址。而*(a+1)+2仅仅是一个指针常量,它是行列编号分别为1和2的数据元素的地址,而不是数据对象,所以也就不能、也没办法取它的地址了。

追问

难道*(a+i)和*(a+i)+0的含义不是一样的么,都是第i行第0列地址,那么按你说的话,这个也算常量指针了,为什么&*(a+i)成立

追答

对应于二维数组,这两个含义确实不一样,前者有两个含义,后者只有一个。
*(a+i) 有两个含义, 主要是因为在于二维数组的特殊性。
1. 二维数组本身也是一个一维数组,只是它的每个元素又都是一维数组。这样的话,
a是数组的首地址,a+i就是数组的下标为i的元素的地址,那么*(a+i)就是数组的下标为i的元素,当然就可以取地址了,也就是可以有表达式 &*(a+i),这个值也就还是a+i;
2. 而另一方面,*(a+i)可以加一个数,原因是*(a+i)本身是一个一维数组,我们就可以把它记成A。 如上,A+2就是数组A的下标为2的元素的地址, 这个地址当然没办法再取地址了。

而如果是*(A+2), 那就是数组A的下标为2的元素(而不是地址了),这时候就有可以取地址了,也就是 & *(A+2), 如果把A所代表的*(a+i)带入的话,那就是 & * ( *(a+i) +2 )了

追问

我是不是可以这么认为,你上面说的A是一维的首地址,因为他有二维数组中的指针变量指向他,那么&A存在,但是A+2本身就是地址,但是已经没有东西再指向他了,就好比int m 中的&m,再加个&绝对错误,因为编译器已经直接翻译成了地址了,再取他的地址根本不存在

追答

是的,可以这么说吧。
如果这样理解应该更顺一些:
任何一个数组名A就是他的下标为0的元素的地址, 这样A也就是A+0,也是下标为0的元素的地址,A+i就是下标为i的元素的地址。
那么*(A+i)就是它的下标为i的元素,也就是A[i]。
&(*(A+i))就是&(A[i]),也就是取它的下标为i的元素地址。
把上面的进一步推广,上面说的元素A[i]还可以是另外一个一维数组B,也就是说在后面的描述里,A[i]和B等价可以互换。对应于这个一维数组B,上面的说法一样是完全成立的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-11-01
因为*(a+1)+2的结果是一个常量,不能再用地址去指向。追问

这个结果是地址啊,怎么是常量?那*(a+i)也是地址啊,也算常量?大神在么,求解答

追答

a+i是地址,*(a+i)是取出地址里的内容,变成了常量。

追问

不能这么说吧,int *p=&m,那么&*p虽然是个数,但是是m的地址啊

追答

你试试,&*p一样是错的,*p已经变成了一个值

追问

我试了,是可以的,你可以试试

相似回答