【问题标题】:Why does *(&identifier)=value works in C?为什么 *(&identifier)=value 在 C 中有效?
【发布时间】: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


【解决方案1】:

运算符&x表示变量x的地址。前面加星号表示变量x地址的内容,也就是x

运算符*& 在这样使用时会相互抵消。

【讨论】:

    【解决方案2】:

    让我为你解析一下:

    int x = 10;
    *(&x) = 20;
    
    • * == 星号运算符
    • &x == 操作数(星号运算符)

    如果操作数指向一个函数,则结果是一个函数 代号;如果它指向一个对象,则结果是一个左值 指定对象。

    操作数(&x == x 的地址,其中 x 是一个 int)指向一个 int 类型的对象。

    => 结果是指定 x(x== 对象)的左值。

    如果操作数的类型为“类型指针”,则结果类型为 “类型”。

    操作数的类型为指向int的指针,因此结果的类型为int。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 2018-12-07
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多