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

时间:2009-08-30 21:02:11

标签: c pointers standards

考虑一下:

int a[2] = {0,1};
int *address_of_second = (&a[1]);

我认为这是有效的,因为它被翻译为& *(a + 1),然后是&和*相互抵消,但我可以指望它,还是特定于编译器?也就是说,C标准对此有什么要说的吗?

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

int *address_of_second = a+1

更好,你同意吗?

感谢。

3 个答案:

答案 0 :(得分:9)

您可以依靠第一个代码示例中的行为。

  

我认为它有效,因为它是   翻译为& *(a + 1)然后&   和*取消对方,但我可以   指望它,还是编译器   具体?也就是说,标准   有什么可说的吗?

a[1]*(a + 1)相同,&a[1]&(*(a + 1))相同,后者为您提供指针(&)(取消引用) ,*)int a + 1。这是明确定义的行为,您可以依赖它。

  

int *address_of_second = a+1

在我看来,这是可读的,但不如&a[1]那么可读。 &a[1]明确显示a是一个指针,您正在引用该指针的偏移量,并且您正在获得指向该偏移量的指针。 a + 1稍微有些含糊不清,因为实际的行并没有告诉你关于a是什么的任何内容(你可以推断它是一个指针,但是你知道的就是那个代码段a可能只是int)。

即便如此,这只是我的意见。你可以自由地决定你自己的风格决定,只要你了解幕后他们在最低级别是相同的。

答案 1 :(得分:1)

如果你在一个小组工作,这是一种风格或代码约定。这两种形式在所有符合标准的编译器上都是c ++兼容的。

我更喜欢前者:)

答案 2 :(得分:1)

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