int main()
{
int i=10,*j,**k,***l;
j=&i;
k=&j;
l=&k;
printf("%d",**(&(&i)));
/* isn't it the same as **k ,
because k=&j and j=&i */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据第6.5.3.2章,C11标准的一元&算子
一元运算
&符的操作数应该是函数指示符,[]或一元运算*符的结果,或者是指定不是位字段且未使用寄存器存储类说明符声明的对象的左值.
但,
一元运算
&符产生其操作数的地址.[..]并且结果不是左值.
这不是左值.所以,&(&i)代码中的访问方式无效.这就是为什么我们需要使用中间指针变量,它可以用作左值(作为一元的操作数提供&).
注意:正确的签名main()是int main(void).