求问大神,指针为什么&(*(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已经变成了一个值

追问

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

求问大神,指针为什么&(*(a+1)+2)出错,&*(a+i)表示第i行首地址,为什么加...
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; p...

求问大神,指针为什么&(*(a+1)+2)出错,&*(a+i)表示第i行首地址,为什么加...
(a+1)+2,就已经表示地址了,表示第1行第2个元素的地址,不用使用&

*(a+1)+2表示1行2列元素a[1][2]的地址,怎么看出来呢?
(a+1)其中a表示整个数组首地址,指向对象是行,所以a+1表示首地址 向后移一行的地址,到a[1]位置,*(a+1)就表示a[1]而a[1](*(a+1))表示第一列的所有数,故它表示的是这一列的首地址 所以*(a+1)+2就表示向这一列后面移动2个位置,指向a[1][2]的地址 希望可以帮到你 ...

c语言指针*(*(a+i)+j)什么意思,*(a+i)为什么是地址啊,a不应该已经是地 ...
(a+i)看出a[i]这是一维地址,a是二维地址。对于a+1不好判断,以数组解释不通,以指针又解释德通,我就不评价了。

c语言二维数组与指针,我想知道为什么*(a+1).与显示中的a+1,所给出的...
一个*是指针 所以ij都是指针 a+1是一个指针,表示第1行的首地址(c中数组时从0开始计数的)在二维数组中,a,a[0],&a[0][0]这三个指针虽然都是a的首地址的值,但是在c中用起来是不一样的 a表示二维数组的首地址 a[0]表示第0行的首地址 &a[0][0]表示第0行的第0个元素的地址 ...

...则a+1和&a[1]表示行地址吧,a[1],*(a+1)表示列地址,为什么他们能这样...
比喻一下:行地址--就是排长;列地址就是班长,排长管班长--对行地址取值就表示列地址,班长管战士---对列地址取值就表示具体的元素了。这样就好理解了:首先分清楚一个数组只有一个排长,然后又多少行就表示有多少班长。a表示第一个班长,那么a+1就表示了第二个班长,也就是属排长管的范围,属行...

二维数组中,a+i表示第i行的地址,那为什么*(a+i)也表示第i行的地址。
a+i和*(a+i)的值相同没错,但它们的类型不一样,代表的意义也不一样。a+i还是2维指针,*(a+i)则是一维指针。编译器对它们的解析和操作是不一样的。

*(*(a+i)+j)中*(a+i)+j 代表什么意思? \/\/ 为啥最外面还要*求值呢
(a+i)+j代表的是第 i行,j列的那个元素,这个没有问题吧。而那个元素是指针。不是值,所以再加*取值。 这和普通的 *p=a;一个意思。主要原因是数组里面放的全部都是指针,你可以看你定义时候的声明就知道了。

*(*(a+i))与*(a+i)
int (*p)[n]是一个数组指针,可以当成一个二维数组看待。*(p+i)代表的是第i行的首地址,是整行元素,*(*(p+i))代表的是第i行第一个元素的地址,同理*(*(p+i)+j)代表的是第i行第j列的地址。本人也是新手,回答的不对的地方还请多多包容。。。

java中*(a+ i)表示什么?
在Java中,表达式`*(a + i)`是非法的,因为Java不支持直接使用指针运算,这是C或C++语言的语法特性。在C或C++中,这个表达式通常用于表示对数组元素的指针解引用,其中`a`是数组的起始地址,`i`是数组索引,整个表达式表示地址`a + i`处的元素值。而在Java中,如果你想访问数组的元素,你需要使用...

相似回答