skc*_*skc 8 c pointers reference dereference
我是C的新手.我需要通过以下代码了解屏幕上打印的每个值的含义:
#include<stdio.h>
int main()
{
int x = 10;
int *ptr = &x;
printf("%d %d %d\n", *ptr,**&ptr, 2**ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(GCC):
10 10 20
Run Code Online (Sandbox Code Playgroud)
在这里,我声明了变量x并ptr指向x变量.所以,*ptr印刷价值x.但我不明白的价值**&ptr和2**ptr.
提前致谢.
msc*_*msc 30
这里,当一个接一个地使用时*,&操作员取消彼此的效果.
**&ptr是一样的*ptr,在这里,ptr持有的地址x变量.所以,打印x这里的值.
2**ptr被解释为2 * (*ptr).所以,2 * (10)等于20.
**&ptr
Run Code Online (Sandbox Code Playgroud)
&并且*是一元运算符,它们具有相反的含义1.
&(lvalue)意味着返回相应的地址lvalue,同时*(lvalue)意味着由左值指向的地址返回值,考虑到左值的类型,以便知道如何取消对它的引用.
视觉这些操作符的含义是这样的(我的天赋artist-mode的emacs不是太大):
+----------------+
| ptr = *&ptr |
+--------------+-+
/ \
/ \
&ptr \
+----------------+
| *ptr |
+----------------+
/
/
ptr
Run Code Online (Sandbox Code Playgroud)
请注意,我在框内标记了正确的值,而在框外的相应内存位置的左值的内存地址.
现在,当你写的时候*&(lvalue),它意味着从lvalue的地址中获取值,这是很快写的lvalue.
所以**&ptr意味着*ptr- 即地址指针的值由ptr引用,在你的情况下取消引用为整数10.
2**ptr
Run Code Online (Sandbox Code Playgroud)
词法分析器会将代码拆分为标记,解析器将构建如下树:
(2) * (*ptr)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,结果将是地址值的2倍ptr,在您的情况下20.