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

Lir*_*evi 4 c standards pointers

考虑:

int a[2] = {0,1};
int *address_of_second = (&a[1]);
Run Code Online (Sandbox Code Playgroud)

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

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

int *address_of_second = a+1
Run Code Online (Sandbox Code Playgroud)

更好,你同意吗?

谢谢.

Mat*_*lin 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).

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