为什么我不能在C中使用`&& a`?

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)

alk*_*alk 7

为什么我不能用 &&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)


Sou*_*nta 5

因为你只能获得一个变量的地址而不是一个值的地址(由&a给出)而且&&是boolean AND,如@UnWind所说.