我已经看到了指针算法的解释(例如Pointer Arithmetic)。但我想知道是否存在真正的区别:
鉴于:
int* arr = (int*) malloc(sizeof(int) * 3);
的作用:
&(arr[1])
和
arr + 1
除了语法之外,有任何不同之处。技术上要么更高效吗?是否有某些上下文在第一个上面使用指针成瘾?我在Printing 1 to 1000 without loop or conditionals看到了一个例子。提前谢谢。
答案 0 :(得分:5)
&arr[1]
和arr + 1
(以及&1[arr]
!)相同,并且都计算相同的指针。根据C标准,§6.5.3.2:
一元&运算符产生其操作数的地址....
...如果操作数是[]运算符的结果,则&运算符和[]所暗示的一元*被评估,结果就像&删除了运算符,并将[]运算符更改为+运算符。
因此,根据规范,&arr[1]
的评估方式就好像是arr + 1
一样。
使用一个通常归结为偏好。就个人而言,当我想指的是指向该元素的指针时,我喜欢使用&arr[x]
;当我想要引用从arr + x
开始的数组时,我喜欢使用x
。
答案 1 :(得分:1)
不,没有区别,甚至没有差异(除非我们谈论编译时间),因为:
arr[1]
相当于*(arr + 1)
和&(*(arr + 1))
中,取消引用和地址运算符都没有做任何事情(C标准明确说明,在这种情况下不会发生取消引用),因此运营商互相取消。因此,在解析和AST构建阶段之后,编译器最终在两种情况下都只有arr + 1
。