§ISO / IEC的6.3.2.1:2 9899:2011,即“ISO C11标准”,说:
2除了当它是
sizeof
操作者的操作数,一元&
运算符,++
运算符,--
操作者,或.
操作员或赋值运算符,不具有阵列型左值的左操作数被转换为值存储在指定对象(并且不再左值);这就是所谓的左值转换。如果左值有限定类型,该值具有左值的类型的非限定版本;附加地,如果左值具有原子类型,该值具有左值的类型的非原子版本;否则,该值具有左值的类型。如果左值有一个不完整的类型,没有数组类型,其行为是不确定的。如果左值指定,可能已被宣布与寄存器存储自动存储时间的对象(从来没有考虑它的地址),而该对象未初始化(不是一个初始化声明并没有分配到已在使用前进行),该行为是不确定的。
但不是取消引用指针也是一个左值,就像指针本身?例如。 int *ptr; ptr = malloc(…); *ptr = 1
那么,为什么*
运营商没有提及 - 或者我在这里混淆的东西吗?
你错过了部分6.5.3.2p4,其中讨论间接运算符*
的语义:
一元运算符
*
表示间接。如果操作数指向一个函数,结果是一个功能标志;如果它指向一个物体,其结果是一个左值指定的对象。如果操作数的类型“指针输入”,结果类型为“类型”。如果无效值已被分配给指针,一元*
操作的行为是不确定的。
操作本身被定义为产生一个左值。