【问题标题】:What is the difference between &p and p&p 和 p 有什么区别
【发布时间】:2016-05-21 18:29:44
【问题描述】:

如果我有一个指向整数的指针,例如:

int num = 12;
int *p = #

然后把地址打印出来

printf("%p\n", (void*)p);

上一个和这个有什么区别:

printf("%p\n", (void*)&p);

【问题讨论】:

  • 指针也是一个变量。在第二种情况下,您正在获取指针的地址。
  • (void*)&p 表示 p 的 地址。而(void*)p 表示 p 的内容。

标签: c address-operator


【解决方案1】:

这里p包含num的地址,所以第一个printf输出num的地址。

另一方面,&pp 的地址,所以第二个printf 打印出p 的地址。

【讨论】:

    【解决方案2】:

    以你为例-

    int num = 12;
    int *p = #                     // store address of num in pointer p
    printf("%p\n", (void*)p);          // line 1
    printf("%p\n", (void*)&p);         // line 2
    

    第 1 行- 在此它将打印存储在指针 p 中的变量 num 的地址。因此,指针p 中存储的值是整数变量num 的地址。

    第 2 行 - 在这个地址指针 p 本身将被打印。注意 address of 运算符的使用。它给出了指针p的地址。

    【讨论】:

      【解决方案3】:

      对于"%p" 格式,仅使用普通p 将打印变量p 的内容,即指针变量p 所指向的地址。

      当您使用&p 时,您将获得变量p 的地址,即指向p 的指针(在您的类型为int ** 的情况下)并打印该指针。

      你可以这样看:

      +----+ +---+ +-----+ | &p | -> | p | -> |编号 | +----+ +---+ +-----+

      换句话说,&p 指向p,而num 又指向num


      如果您继续并尝试使用*p,那将无法按预期工作。它将取消引用指针p,即它将导致位于p 的位置的值是指针(在这种特定情况下,变量num 及其值)。 *pint 类型的值,尝试使用 "%p" 格式打印它会导致 未定义的行为,因为 *p 不是指针而是值,而 @ 987654340@ 格式需要一个指针。

      很可能不会发生任何不好的事情,并且在指针大小与 int 大小相同的系统上(这是大多数 32 位系统)然后声明

      printf("%p", (void *) *p);
      

      只会打印c,即十六进制值12,即num的值。

      但是,如果指针的大小int 的大小相同,就像在典型的 64 位系统上一样,那么输出将无法预测,并且会大部分看起来完全随机。

      【讨论】:

        【解决方案4】:
        printf("%p\n", (void*)p);
        

        打印p包含的值,即num的地址。

        printf("%p\n", (void*)&p);
        

        打印指针p本身的地址。

        【讨论】:

          【解决方案5】:

          前者打印num的地址。 后者打印指针 p 的地址。 因为,一切都需要在内存中的一个位置来存储。

          如果你取一个整数, 它有一个存储它的物理地址,以及存储在该位置的数据(整数)。

          如果你拿一个指针, 它还有一个物理地址,它存储在内存中,但在这里数据变成了另一个地址,即某个整数变量的地址。

          & 称为操作符的地址。它返回存储特定变量的内存地址。 同样的例子,

          printf("%p\n", (void*)p);

          打印指针 p 指向的数据。即 num 的地址。

          类似的结果可以使用,

          printf("%p\n", (void*)&num);

          因此,两者都会产生相同的结果。

          而,

          printf("%p\n", (void*)&p);

          打印指针 p 的地址。

          【讨论】:

            【解决方案6】:

            (void*)&p表示p的地址

            (void*)p 表示 p 的内容(在本例中为num地址)。

            (void*)*p 表示变量p 指向(12) 的内容num)。

            有关地址运算符的更多详细信息,请参阅http://www.c4learn.com/c-programming/c-pointer-address-operator/

            【讨论】:

            • 不正确。 *p 是 p 的内容。 (void *)p 是演员。
            • @stackoverflowuser2010 我没有正确解释自己。我说p的“内容”。我的意思是num的地址。对不起。感谢您引起我的注意。我的回答现在更准确了吗?请确认。
            • 第二点现在措辞很尴尬。 p 本身只是 p 的内容,无论此问题的上下文如何。在这个OP的问题的特殊情况下,pnum的地址,所以它的内容确实是num的地址。
            • @stackoverflowuser2010 如果您觉得有需要,我很高兴您可以调整我的语法。仍然感谢您的 cmets。赞赏。
            • @stackoverflowuser2010 我已经修改了。
            【解决方案7】:

            您可以在 c/c++ 函数中传递两种类型的参数。

            第一个是按值调用,它在程序中调用类似 (void)p 的东西,它复制相同的值,并且该特定 void 函数中的值不会改变。

            第二个是通过引用调用,它实际上进入内存并找出那个特定的位置/地址并在那里改变它的值。这是你的情况(无效)&p

            【讨论】:

              猜你喜欢
              • 2019-12-14
              • 2022-12-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-06
              • 2013-12-10
              • 2016-01-23
              • 2014-05-30
              相关资源
              最近更新 更多