【问题标题】:What is the meaning of "**&ptr" and "2**ptr" of C pointer?C指针的“**&ptr”和“2**ptr”是什么意思?
【发布时间】:2018-04-09 19:10:40
【问题描述】:

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

#include<stdio.h>

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

输出(GCC):

10 10 20

在这里,我声明了变量xptr 指向x 变量。所以,*ptr 的打印值为x。但是看不懂**&amp;ptr2**ptr的值。

提前致谢。

【问题讨论】:

  • 前 10 个是 ptr 的内容(而 ptr 是 x 的 adr)所以它是 x 的内容 ...第二个你 & = 你得到 ptr 的 adr,* = 你得到它的内容,* = 你再次得到 ptr 的内容,它也是 x。最后一个你将 *ptr 乘以 2 和 *ptr 再次是 x 的内容
  • 如果您了解*ptr 是什么,那么您可能会明白2 * *ptr 是在合理的格式下是什么。 (是*ptr 的两倍。)

标签: c pointers reference dereference


【解决方案1】:

这里*&amp;运算符在一个接一个使用时相互取消效果。

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

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

【讨论】:

    【解决方案2】:

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

    现在 & 是 C 中的地址运算符。 &ptr 返回 ptr 的地址。 所以 *&ptr 从 ptr 的地址返回值。所以 * 和 & 将相互抵消。即 ptr 和 *&ptr 是一回事。

    ptr = *&amp;ptr =&gt; *ptr = **&amp;ptr 因此值为 10。

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

    【讨论】:

    • "*ptr 是一个指针变量。" 不。 ptr 是指针变量。正如您正确提到的:*ptr 是取消引用指针ptr。所以实际上*ptr 的计算结果是int
    【解决方案3】:
    **&ptr
    

    &amp;* 是一元运算符,它们的含义相反。

    &amp;(lvalue)表示返回对应的lvalue的地址,*(lvalue)表示从左值指向的地址返回值,考虑左值的类型,以便知道如何解引用。

    从视觉上看,这些运算符的含义是这样的(我在artist-modeemacs 中的天赋不算太大):

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

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

    现在写*&amp;(lvalue),意思是从左值的地址获取值,写成lvalue

    所以**&amp;ptr 表示*ptr - 即来自地址指针的值 ptr,取消引用为整数,在您的情况下为 10。


    2**ptr
    

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

    (2) * (*ptr)
    

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

    【讨论】:

    • 不错的答案,但老实说,我发现你的图表很混乱。例如,ptr 被报告两次,一次在盒子内,一次在外面。而且任何地方都没有x=10
    • @FabioTurati 在框内是右值,在框外是左值。没有 x=10,因为答案是抽象的,而不是具体的。
    【解决方案4】:

    int *ptr 指向 int x。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 2022-01-08
      • 2013-03-05
      • 1970-01-01
      • 2020-04-28
      • 2014-07-11
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多