C指针算术效率

时间:2013-04-09 01:12:12

标签: c performance pointers

我已经看到了指针算法的解释(例如Pointer Arithmetic)。但我想知道是否存在真正的区别:
鉴于:

int* arr = (int*) malloc(sizeof(int) * 3);

的作用:

&(arr[1])

arr + 1

除了语法之外,有任何不同之处。技术上要么更高效吗?是否有某些上下文在第一个上面使用指针成瘾?我在Printing 1 to 1000 without loop or conditionals看到了一个例子。提前谢谢。

2 个答案:

答案 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