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

What is the meaning of "**&ptr" and "2**ptr" of C pointer?

我是C新手,需要通过以下代码了解屏幕上打印的每个值的含义:

#include<stdio.h>

int main() 
{
     int x = 10;
     int *ptr = &x;
     printf("%d %d %d\n", *ptr,**&ptr, 2**ptr);
     return 0;
}

输出(海湾合作委员会):

10 10 20

在这里,我声明了变量x并且ptr指向x变量。因此,*ptr 打印了 x 的值。但是我看不懂**&ptr2**ptr的值。

提前致谢。

这里,*&运算符在依次使用时相互抵消。

**&ptr*ptr 相同,这里 ptr 保存 x 变量的地址。所以,在这里打印 x 的值。

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

**&ptr

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

&(lvalue)表示return相应lvalue的地址,而*(lvalue)表示return左值指向的地址的值,考虑左值的类型,以便了解如何取消引用它。

这些运算符的含义直观看起来是这样的(我在emacsartist-mode方面的天赋不算太大):

        +----------------+            
        |  ptr = *&ptr   |            
        +--------------+-+            
       /                \
      /                  \
     &ptr                 \
                           +----------------+
                           |    *ptr        |
                           +----------------+
                          /
                         /
                        ptr

注意我在方框内标注了右边的值,而在方框外标注了对应内存位置的左边值的内存地址。

现在写*&(lvalue)的意思是从左值的地址取值,写的很短lvalue.

所以 **&ptr 表示 *ptr —— 即来自 ptr 的地址指针的值,在你的例子中被取消引用为整数,在你的例子中是 10.


2**ptr

词法分析器将代码拆分为标记,解析器将构建这样的树:

(2) * (*ptr)

在这种情况下,结果将是 ptr 地址值的 2 倍,在您的情况下 20.

ptr 是一个指针变量。该指针变量将指向存储 x 值的内存位置。 *ptr 将访问指针变量指向的值。

现在 & 是 C 中的地址运算符。 &ptr returns ptr 的地址。 所以 *&ptr returns 来自 ptr 地址的值。所以 * 和 & 会互相抵消。即 ptr 和 *&ptr 是一回事。

ptr = *&ptr => *ptr = **&ptr 因此值为 10.

2**ptr 只不过是 2 * (*ptr)。因此值为 20.

int *ptr 指向 int x。

printf("%d\n", *ptr); 表示 - 在 prt 点处取值。所以 *ptr 是 x 值。

printf("%d\n", **&ptr); - &ptr 是指针的地址,*&ptrptr 中的值。 &ptr 的值是 x 的地址。所以 **&ptrx

的值

printf("%d\n", 2**ptr); - 2 乘以 ptr 中的值。意思是 2*x