简单变量i和*(&i)之间的差异;

gs6*_*50x 7 c variables pointers

我有以下C程序:

int main()
{
    int i = 5;
    printf("Simple value of i = %d", i);
    printf("\nPointer value of i = %d", *(&i));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这两个printf()将打印相同的东西,即5.根据我的理解&被用于地址值, *并用于选择该地址上的值.

我的问题是:为什么我们需要*(&i)一个简单的i变量可以实现同样的事情?

usr*_*usr 7

我的问题是为什么我们需要*(&i)如果用简单的i变量可以实现同样的东西?

好吧,你不需要它.

表达式*(&i)相当于i.

6.5.3.2地址和间接运营商说:

一元*运算符表示间接.如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值.如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针分配了无效值,则unary*运算符的行为未定义.102)

脚注:

因此,&*E等效于E(即使E是空指针),并且&(E1 [E2])等于((E1)+(E2)).[..]

只要可观察行为(参见:5.1.2.3程序执行)相同,C标准允许编译器以任何方式转换代码.声明如下:

printf("\nPointer value of i = %d", *(&i));
Run Code Online (Sandbox Code Playgroud)

理论上可以转化为:

printf("\nPointer value of i = %d", i);
Run Code Online (Sandbox Code Playgroud)

由编译器而不违反C标准.


Bat*_*eba 6

*(&i)几乎完全一样i.

允许编译器对其进行优化,但请注意,如果存在i被占用地址的副作用(例如,它不能再仅存储在CPU寄存器中),则不允许这样做.

  • 我找不到有关标准的相关信息.取地址可以防止寄存器存储,但我找不到优化`&`本身会受到限制的证据. (5认同)
  • 很好的答案.你能详细说明副作用吗?有关挥发性或此类? (3认同)