显然,&a[i]
和a+i
都会返回int*
。问题是它们是否以相同的方式执行,因为&a[i]
中有两个运算符,a+i
只有一个运算符?
答案 0 :(得分:12)
在C中,它们是相同的。 C标准将a[i]
定义为与*(a + i)
相同,因此&a[i]
仅为&*(a + i)
,即a + i
。 (令人惊讶的结果是你可以轻松地写i[a]
。)
运营商的数量在这里没有实际意义。
答案 1 :(得分:5)
从历史上看,从技术上讲,给定int a[10];
,&a[10]
过去在技术上是无效的,因为它将指针取消引用超过数组的末尾,而a+10
始终有效。
如今:a[i]
定义为*(a+i)
,因此&a[i]
表示&*(a+i)
。当a
是数组或指针,i
是整数时,则是,等于a+i
。当&
和*
都应用于同一指针表达式时,它们现在被明确指定为无效。
对历史感兴趣的人的更多细节:这是在C99中添加的文本。
6.5.3.2地址和间接运营商
3 [...]如果操作数是一元
*
运算符的结果,则不会对该运算符和&
运算符进行求值,结果就好像两者都是 省略,除了对运算符的约束仍然适用且结果不是左值。
此文本尚未在C89 / C90中出现,因此指向*
运算符的指针必须实际指向仍在技术上应用的对象或函数。该标准专门更改,以使此类结构有效。