2009-08-30 18 views
4

考虑:获得同时使用方括号和符号地址

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

我认为这个工程,因为它翻译成& *(A + 1),然后&和*相互抵消,但我可以依靠它,还是编译器特定?也就是说,C标准对此有什么要说的吗?

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

int *address_of_second = a+1 

是更好的,你同意吗?

谢谢。

回答

9

你可以指望你的第一个代码示例中的行为。

我相信它的作品,因为它 转换为& *(A + 1),然后& 和*相互抵消,但我 指望它,还是它编译特定 ?也就是说,标准 有什么要说的呢?

a[1]相同*(a + 1),和&a[1]相同&(*(a + 1)),它给你在a + 1指针(&)到(废弃时,*)INT。这是您可以信赖的定义良好的行为。

int *address_of_second = a+1

这是可读的,但在我看来不是很可读为&a[1]&a[1]明确显示a是一个指针,你引用了该指针的偏移量,并且你得到了一个指向该偏移量的指针。 a + 1稍微含糊不清,因为实际的行不会告诉你任何关于什么a(你可以推断,它是一个指针,但你知道从这个片段a可能只是一个int)。

即便如此,这只是我的看法。你可以自由地做出你自己的风格决定,只要你明白在幕后他们在最低级别是相同的。

+0

同意。为了增加马修的观点:在你的例子中,'a'是一个数组,所以第一种样式通常更合适,因为&a [1]可以很容易地读作“数组a中元素1的地址”。根据我的经验,将数组视为指针,虽然技术上正确,但可能会导致混淆。 – GrahamS 2009-08-31 17:16:44

1

如果你在一个团队中工作,这是一个风格或代码约定的问题。这两种形式在所有符合的编译器上都是C++兼容的。

我更喜欢前者:)

1

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