C 使用方括号和符号获取地址

C 使用方括号和符号获取地址,c,pointers,standards,C,Pointers,Standards,考虑: int a[2] = {0,1}; int *address_of_second = (&a[1]); 我假设这是可行的,因为它被转换为&*(a+1),然后,&和*相互抵消,但我能指望它吗,或者它是特定于编译器的吗?也就是说,C标准对此有什么要说的吗 这是一种体面的写作方式吗? 我个人认为: int *address_of_second = a+1 这样更好,你同意吗 谢谢。您可以信赖第一个代码示例中的行为 我认为它是有效的,因为它是 转换为&*(a+1),然后& 然后互相取

考虑:

int a[2] = {0,1};
int *address_of_second = (&a[1]);
我假设这是可行的,因为它被转换为&*(a+1),然后,&和*相互抵消,但我能指望它吗,或者它是特定于编译器的吗?也就是说,C标准对此有什么要说的吗

这是一种体面的写作方式吗? 我个人认为:

int *address_of_second = a+1
这样更好,你同意吗


谢谢。

您可以信赖第一个代码示例中的行为

我认为它是有效的,因为它是 转换为&*(a+1),然后& 然后互相取消,但我可以吗 指望它,还是它是编译器 具体的也就是说,标准 你有什么要说的吗

a[1]
*(a+1)
相同,
&a[1]
&(*(a+1))
相同,它给你一个指针(
&
),指向
a+1
处的(取消引用的,
*
)int。这是一种定义明确的行为,可以信赖

int*地址/u秒=a+1

这是可读的,但在我看来不如
&a[1]
可读
&a[1]
明确显示
a
是一个指针,您正在引用该指针的偏移量,并且您正在获取指向该偏移量的指针
a+1
更为模糊,因为实际的一行并没有告诉您
a
是什么(您可以推断它是一个指针,但从该代码段中您所知道的
a
可能只是一个
int


尽管如此,这只是我的看法。你可以自由地做出你自己的风格决定,只要你明白,在幕后,它们在最低层次上是相同的。

如果你在一个团队中工作,这是风格或代码惯例的问题。这两种格式都是C++兼容的,所有的编译器都兼容。
我更喜欢前者:)

两者都有效。我个人的偏好是
&(a[1])
a+1
。我更喜欢第一个括号的位置,因为它清楚地表明了我的地址。我倾向于在大多数情况下使用它。如果所讨论的代码正在执行大量指针运算,那么我可能会使用第二种形式。

同意。补充一下Matthew的观点:在您的示例中,“a”是一个数组,因此第一种样式通常更合适,因为&a[1]可以很容易地理解为“数组a中元素1的地址”。根据我的经验,将数组视为指针虽然在技术上是正确的,但可能会导致混淆。