ISO/IEC 9899:2011的§6.3.2.1:2,即"ISO C11标准",表示:
2除非它是
sizeof
运算符的操作数,否则一元&
运算符的++
运算符、--
运算符或左操作数.
运算符或赋值运算符,一个没有数组类型转换为存储在指定对象中的值(不再是左值);这被称为左值转换。如果lvalue具有限定类型,该值具有的非限定版本左值的类型;另外如果左值具有原子类型,该值具有左值类型的非原子版本;否则,该值具有左值的类型。如果左值具有类型不完整且没有数组类型,则行为为未定义。如果左值指定了一个自动存储对象可以用寄存器存储类声明的持续时间(从未获取过其地址),并且该对象未初始化(未使用初始值设定项声明,但尚未对其进行赋值在使用之前执行),行为是未定义的。
但是一个被取消引用的指针不是也是一个左值吗,就像指针本身一样?例如int *ptr; ptr = malloc(…); *ptr = 1
那么,为什么*
运算符没有被提及——或者我混淆了这里的一些内容?
您缺少第6.5.3.2p4节,该节讨论了间接运算符*
:的语义
一元
*
运算符表示间接性。如果操作数指向一个函数,则结果为函数指示符如果它指向对象,结果是指定该对象的左值如果操作数的类型为"pointer to type",结果为键入"type"。如果指定了无效值指针,一元的行为*
运算符未定义。
运算符本身被定义为产生一个左值。