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

时间:2018-01-05 10:12:59

标签: c pointers variables

我有以下C程序:

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

两个printf()都会打印相同的内容,即5个。根据我的理解,&用于地址值,*用于选择值地址。

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

2 个答案:

答案 0 :(得分:7)

  

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

嗯,你不需要它。

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

6.5.3.2 Address and indirection operators说:

  

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

脚注:

  

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

只要可观察行为(参见:5.1.2.3 Program execution)相同,C标准就允许编译器以任何方式转换代码。 所以声明:

printf("\nPointer value of i = %d", *(&i));
从理论上讲,

可以转化为:

printf("\nPointer value of i = %d", i);

编译器没有违反C标准。

答案 1 :(得分:6)

*(&i) 几乎i完全相同。

允许编译器对其进行优化,但请注意,如果存在i地址的副作用,则不允许执行此操作(它不能再仅存储在例如,CPU寄存器。)