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)
更好,你同意吗?
谢谢.
您可以依靠第一个代码示例中的行为.
我认为它的工作原理是因为它被翻译成&*(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
).
即便如此,这只是我的意见.你可以自由地决定你自己的风格决定,只要你了解幕后他们在最低级别是相同的.