我有以下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
?
答案 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寄存器。)