C 为什么不是';难道不可能用双符号和来寻址指针吗?

C 为什么不是';难道不可能用双符号和来寻址指针吗?,c,pointers,C,Pointers,根据第6.5.3.2章,C11标准,一元&运算符 一元&运算符的操作数应为函数指示符、[]或一元*运算符的结果,或为指定非位字段且未使用寄存器存储类说明符声明的对象的左值 但是, 一元&运算符生成其操作数的地址。[…]结果不是左值 这不是一个左值。因此,代码中访问&&i)的方式无效。这就是为什么我们需要使用中间指针变量,它可以用作左值(作为一元&的操作数提供) 注:main()的正确签名为int main(void)根据第6.5.3.2章,C11标准,一元&运算符 一元&运算符的操作数应为函数指

根据第6.5.3.2章,
C11
标准,一元
&
运算符

一元
&
运算符的操作数应为函数指示符、[]或一元
*
运算符的结果,或为指定非位字段且未使用寄存器存储类说明符声明的对象的左值

但是,

一元
&
运算符生成其操作数的地址。[…]结果不是左值

这不是一个左值。因此,代码中访问
&&i)
的方式无效。这就是为什么我们需要使用中间指针变量,它可以用作左值(作为一元
&
的操作数提供)


注:
main()
的正确签名为
int main(void)

根据第6.5.3.2章,
C11
标准,一元
&
运算符

一元
&
运算符的操作数应为函数指示符、[]或一元
*
运算符的结果,或为指定非位字段且未使用寄存器存储类说明符声明的对象的左值

但是,

一元
&
运算符生成其操作数的地址。[…]结果不是左值

这不是一个左值。因此,代码中访问
&&i)
的方式无效。这就是为什么我们需要使用中间指针变量,它可以用作左值(作为一元
&
的操作数提供)


注意:
main()
的正确签名是
int main(void)

这与您无法获取例如整数文本的地址的原因相同,它不是存储在任何地方的内容


变量(例如
k
)存储在内存中,这就是为什么可以使用
&k
获取
k
的地址,而
k
实际上是指向
k
的指针。
k
本身是一个指针并不重要。

同样的原因是,你不能得到一个整数文本的地址,它不是存储在任何地方的东西

变量(例如
k
)存储在内存中,这就是为什么可以使用
&k
获取
k
的地址,而
k
实际上是指向
k
的指针。
k
本身是指针并不重要。

**(&(&i))
不等于
**k
。因为
&i
会给出
i
的地址,比如
0x12345
。现在再次对其应用
&
是无效的,因为
&
要求将左值作为操作数,但
0x12345
是右值

*(&(*(&i))
等同于
**k
**(&(&i))
不等于
**k
。因为
&i
会给出
i
的地址,比如
0x12345
。现在再次对其应用
&
是无效的,因为
&
要求将左值作为操作数,但
0x12345
是右值

*(&(*(&i))
相当于
**k

表达式
&(&i)
要求
i
的地址;这样的手术是荒谬的。地址没有地址

表达式
&i
的结果不是左值;它不会占用任何内存,因此您可以对其进行写入或获取其地址

表达式
&(&i)
要求的是
i
的地址;这样的手术是荒谬的。地址没有地址

表达式
&i
的结果不是左值;它不会占用任何内存,因此您可以对其进行写入或获取其地址

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;
}