【发布时间】:2016-08-21 16:59:52
【问题描述】:
例如,
int x = 10;
*(&x) = 20;
printf("%d \n",x); // output is 20
根据 ISO C11-6.5.3.2 第 4 段,它说
一元 * 运算符表示间接。如果操作数指向一个 函数,结果是一个函数指示符;如果它指向一个 对象,结果是指定对象的左值。如果操作数 类型为“类型指针”,结果类型为“类型”。如果 无效的值已分配给指针,的行为 一元 * 运算符未定义。
由于操作数 &x 既不是函数指示符也不是对象指示符(它是一个指向 int 类型的指针),我预计会有未定义的行为,但它工作得很好!我错过了什么?
【问题讨论】:
-
“如果操作数的类型为‘‘pointer to type’’,结果的类型为‘‘type’’”,操作数显然有指向类型的指针。
-
为什么你会认为
&x是无效值? -
"如果它指向一个对象,结果是一个指定该对象的左值。"
&x指向int,即x。 -
操作数 (
&x) 指向一个对象,其类型为pointer to int,因此结果是一个左值,指定了一个 int 类型的对象,正如段落中所说的那样。 -
您是否有机会通过阅读标准来学习 C?如果是这样,我建议您找到其他资源。该标准面向已经非常了解该语言的编译器编写者,而不是初学者。
标签: c dereference