Jin*_*won 0 c pointers operators address-operator
int main(int argc, char * argv[]) {
int a = 10;
int * sp = &a;
int * * dp1 = &sp;
int * * dp2 = &&a; // NG
int * * dp3 = &(&a); // NG
int * * dp4 = &((int *) &a); // NG
}
Run Code Online (Sandbox Code Playgroud)
$ cc test.c
test.c: In function ‘main’:
test.c:6:17: error: lvalue required as unary ‘&’ operand
int * * dp3 = &(&a); // NG
^
test.c:7:17: error: lvalue required as unary ‘&’ operand
int * * dp4 = &((int *) &a); // NG
^
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
Run Code Online (Sandbox Code Playgroud)
为什么我不能用
&&a
因为&它为您提供了varibale的地址而&a不是变量.
C 11草案规定如下:
6.5.3.2地址和间接运营商
约束
1一元&运算符的操作数应该是函数指示符,[]或一元*运算符的结果,或者是一个左值,它指定一个不是位字段的对象,并且不用寄存器存储类声明符.
[...]
语义
3一元&运算符产生其操作数的地址.[...]
为了解决这个"限制",可以使用像这样的复合文字来引入临时存储(假设至少是C99):
int a = 42;
int ** ppa = &((int *){&a});
Run Code Online (Sandbox Code Playgroud)
作为旁注,请参阅以下错误消息:
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
Run Code Online (Sandbox Code Playgroud)
gcc(可能还有其他人)定义了C-Standard的扩展,允许&&在操作符标识标签时在单个操作符上使用操作符.(更多相关内容:https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)
例:
void * pv = &&lbl;
goto *pv;
/* some dead code */
lbl:;
/* living code again here */
Run Code Online (Sandbox Code Playgroud)