C指针的"**&ptr"和"2**ptr"是什么意思?

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)

在这里,我声明了变量xptr指向x变量.所以,*ptr印刷价值x.但我不明白的价值**&ptr2**ptr.

提前致谢.

msc*_*msc 30

这里,当一个接一个地使用时*,&操作员取消彼此的效果. 

**&ptr是一样的*ptr,在这里,ptr持有的地址x变量.所以,打印x这里的值.

2**ptr被解释为2 * (*ptr).所以,2 * (10)等于20.


ali*_*oar 9

**&ptr
Run Code Online (Sandbox Code Playgroud)

&并且*是一元运算符,它们具有相反的含义1.

&(lvalue)意味着返回相应的地址lvalue,同时*(lvalue)意味着由左值指向的地址返回值,考虑到左值的类型,以便知道如何取消对它的引用.

视觉这些操作符的含义是这样的(我的天赋artist-modeemacs不是太大):

        +----------------+            
        |  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.

  • 很好的答案,但说实话,我觉得你的图表很混乱.例如,`ptr`报告两次,一次在一个盒子内,一次在外面.并且在任何地方都没有"x = 10". (5认同)