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变量可以实现同样的事情?
我的问题是为什么我们需要*(&i)如果用简单的i变量可以实现同样的东西?
好吧,你不需要它.
表达式*(&i)相当于i.
一元*运算符表示间接.如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值.如果操作数的类型为''指向类型'',则结果的类型为''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标准.
*(&i)是几乎完全一样i.
允许编译器对其进行优化,但请注意,如果存在i被占用地址的副作用(例如,它不能再仅存储在CPU寄存器中),则不允许这样做.
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |