考虑一下:
int a[2] = {0,1};
int *address_of_second = (&a[1]);
我认为这是有效的,因为它被翻译为& *(a + 1),然后是&和*相互抵消,但我可以指望它,还是特定于编译器?也就是说,C标准对此有什么要说的吗?
这是一个体面的写作方式吗? 我个人认为写作:
int *address_of_second = a+1
更好,你同意吗?
感谢。
答案 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
。我更喜欢第一个支架位置,因为它清楚地说明了我所采用的地址。在大多数情况下,我倾向于使用它。如果有问题的代码正在进行大量的指针运算,那么我可能会使用第二种形式。