【C语言】*(p+i) [j] 和 (*(p+i))[j] 的区别问题。万分感谢!!

我用visual C++运行得知 :
*(p+i) [j] 和 (*(p+i))[j]
的运算结果是不同的。
然后我上网查了() []是1级优先级,左结合
* 是2级优先级,右结合

可是我仍然看不懂,为什么它们俩是不同的。能分别详细说下他们俩的运算步骤吗?非常感谢!!

*(p+i) [j]分两步
1.tmp = (p+i)[j
2.return *tmp

(*(p+i))[j] 的两步
1. tmp = *(p+i)
2. return tmp[j]

具体举例来说
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
int i = 1, j = 2;

则*(p+i) [j] = *(p+1)[2]
1. tmp=(p+1)[2], p先往右移1位,指向a[1],再以a[1]为起点,返回它右边2位的a[3],因此tmp=a[3]
2. 返回*tmp也就是*a[3],a[3]本身在这里并不是指针,因此*a[3]在这里没有任何意义,编译器会报错。

可以想见,这一用法必须用于数组元素全部是指针的情况中,这样a[3]本身才会是指针,*a[3]才有意义。

而 (*(p+i))[j] = (*(p+1))[2]
1. tmp = *(p+1), p+1指向a[1],*(p+1)就是a[1]本身
2. return tmp[j],也就是返回a[1][2],在这里a并不是二维数组,因此a[1][2]也毫无意义,继续报错。

可以看出,这一用法必须用于二维数组。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-04
比如*p[j]与(*p)[j]:
第一个是数组指针,首先p[j]是一个数组,然后*p[j]就是指向这个数组的指针。
第二个是指针数组,首先*p是一个指针,然后这个(*p)[j]数组中的元素都是指针类型的数据。
第2个回答  2011-08-04
前者是指针,后者是数组
有些东西不用太深入,实际运用上很少会用到的··· 估计您是个学生吧?工作后这个问题就不再是个问题了··· 除非您要做的是Design而非Debuger,而且实际程序中这种东西都是能避则避,所以除非是很特殊的系统,否则要用到这个也很难遇到的
第3个回答  2011-08-04
*(p+i)[j]等价于*(p+i+j),进一步等价于p[i+j]

(*(p+i))[j]等价于*(*(p+i)+j),进一步等价于p[i][j]
第4个回答  2011-08-04
*(p+i) [j] = *((p+i)[j])

请教C语言指针中 &p[0] p+i *(p+i) p[i] 区别 一直感觉很迷茫
C语言规定,对所定义的数组,数组名称等价于数组的首地址,即数组第一个元素的地址 & 是计算变量地址的运算符, * 是求出指定地址中的数据内容的运算符 所以,在定义了一维数组p的前提下,&p[0] 指的是数组第一个数组元素的地址,&p[0] 与 p 是等价的 p+i 是数组下标为i的数组元素的地址,...

c语言中*p+i和*(p+i)有什么不同
p+i : *的优先级高于+,所以先计算*p,即取用指针p指向的内存中的数据,然后将该数据和i相加 (p+i): 先计算括号中的p+i ,即将指针p向后移动i个位置,然后做*运算取用其中的数据

(*(p+i))[j]什么意思啊
是二维数组的指针定义方式。假设该数组为a,p指向该数组的a【0】【0】,*p表示取该行的值。p+i表示指针移动了i个位置,即此时p指向a【i】【0】,*(p+i)表示取第i行的值,*(p+i)【j】则指定了取出第i行第j个数值。

*p+i和*(p+i)有什么区别啊?新人求解……
p如果是数组的指针,指向的是数组的第一个元素,也就是说p就是第一个元素的地址,因此以为数组里面*p代表第一个元素的值,*p+i 代表第一个元素的值+i,而*(p+i)代表数组的第i个元素的值。二维数组里面*p指向这个二维数组的第一个一维数组,*p+i 就是把这个地址偏移i;(p+i)是指向二维数组的...

请教C语言指针中 &p[0] p+i *(p+i) p[i] 区别 一直感觉很迷茫
&p[0] 就是 p,&是取地址符号,所以它是指p[0]的地址,也就是p p+i 就不用解释了 (p+i) 是指p这个指针向后移动i位。它就等于p[i]p[i]就是数组中第i个元素。因为数组其实是用指针存放的,p就是第0个元素p[0]的地址(为了方便,我喜欢把第一个元素叫做第0个,因为它的下标是0,...

*(*(p+i)+j)怎么解释? p是指针 p+i 就应该是指向下个元素的首地址 那么...
p应该是二级指针,也就是行指针 p+i表示指向第i行,*(p+i)是第i行的首地址,*(p+i)+j表示的就是指向第i行第j列的地址,*(*(p+i)+j)就是第第i行第j列的元素值了

C语言问题。 *p+i与*(p+i)有什么区别啊?
其实在定义时你这样理解就很清楚答案了:char *p;理解成char (*p);*p在一起是一个char。那么,*p+i就是*p的值加上i,而*(p+i)是在先p+i再*操作,*是什么意思呢,在这里是“取值”。所以,*(p+i)是把指针移动i个位置,再返回前地址的值。

在c语言的指针运算中*(p+1)与p+1有什么区别 p是指针
一、指代不同 1、*(p+1):表示具体的数值。2、p+1:表示内存地址。二、指向的值不同 1、*(p+1):指针p所指向的内存地址单元的下一个内存地址单元中的值。2、p+1:指针p所指向的内存地址的下一个内存地址。三、内存表示不同 1、*(p+1):*的优先级比+的优先级高,所以*P+1在编译器中...

C语言(*(*p+i))是什么意思
p应该是指向二维数组的首地址 (*(*p+i))代表的是第一行第i列的值

C语言中指针*p+i与p+i表示的意思相同吗?
不一样;p+1 指的是指针p所指的变量加1 p+1 指的是指针向后移一位

相似回答