Jam*_*lis 50
这个问题的答案是:它取决于你遵循的语言标准:-).
在C90和C++中,这是无效的,因为您对空指针执行间接(通过执行*p),这样做会导致未定义的行为.
但是,在C99中,这是有效的,格式良好且定义明确的.在C99中,如果unary-的操作数&作为应用unary-的结果获得*或通过进行下标([]),则无论是&也不*或[]施加.例如:
int* p = 0;
int* q = &*p; // In C99, this is equivalent to int* q = p;
Run Code Online (Sandbox Code Playgroud)
同样,
int* p = 0;
int* q = &p[0]; // In C99, this is equivalent to int* q = p + 0;
Run Code Online (Sandbox Code Playgroud)
从C99§6.5.3.2/ 3:
如果[一元运算
&符] 的操作数是一元运算符的结果*,则不会对该运算符和&运算符进行求值,结果就好像两者都被省略,除了对运算符的约束仍然适用且结果不是左值.类似地,如果操作数是
[]运算符的结果,&则不会对运算符或*由其暗示的一元[]进行求值,结果就像&删除了[]运算符并将运算符更改为+运算符一样.
(及其脚注,#84):
因此,
&*E相当于E(即使E是一个空指针)
| 归档时间: |
|
| 查看次数: |
2584 次 |
| 最近记录: |