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的地址”。根据我的经验,将数组视为指针虽然在技术上是正确的,但可能会导致混淆。