例如,
int x = 10;
*(&x) = 20;
printf("%d \n",x); // output is 20
根据ISO C11-6.5.3.2第4段,它说
一元*运算符表示间接。如果操作数指向a 功能,结果是功能指示符;如果它指向一个 对象,结果是指定对象的左值。如果是操作数 有类型''指向类型'',结果类型''类型''。如果 无效值已分配给指针,行为 unary *运算符未定义。
由于操作数&x
既不是函数指示符也不是对象指示符(它是指向int类型的指针),我期望未定义的行为,但它工作正常!我错过了什么?
答案 0 :(得分:5)
运算符&x
表示变量x
的地址。当您在其前面使用星号时,这表示变量x
地址处的 内容,只是x
。
运营商*
和&
相互抵消,就像那样使用。
答案 1 :(得分:1)
让我为你解析一下:
int x = 10;
*(&x) = 20;
*
==星号运算符&x
==操作数(星号运算符)如果操作数指向函数,则结果为函数 标志;如果它指向一个对象,结果是一个左值 指定对象。
操作数(& x == x的地址,其中x是int)指向int类型的对象。
=>结果是左值指定x(x ==对象)。
如果操作数具有类型''指向类型'的指针,则结果具有类型 “类型'”。
操作数的类型为指向int 的指针,因此结果的类型为int。