【问题标题】:What is the address of a pointer in C?C中指针的地址是什么?
【发布时间】:2022-01-01 20:11:19
【问题描述】:
    int main()
    {
    int *p;

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

    return 0;
    }

通过执行此代码,我收到以下输出:

    0x16b77f710 
    0x104683f4c 

我希望得到相同的内存地址,因为&p id 没有引用到任何其他变量。

为什么我得到两个不同的内存地址?

谢谢,

【问题讨论】:

  • 因为 p 不指向自己。
  • int *p; 不会初始化p,所以printf("%p \n", p); 会打印一些随机垃圾值
  • 您需要void *p = &p; 才能获得相同的输出。
  • 程序尝试使用未初始化的变量。这具有未定义的行为。输出可以是任何东西。 “因为 &p id 没有引用任何其他变量”是不合理的。

标签: c pointers memory-address ansi-c


【解决方案1】:

我希望得到相同的内存地址,因为 &p id 没有引用到任何其他变量。

指针变量不会自动指向自己;如果您没有显式初始化它们,那么它们的初始值将是indeterminate(或NULL,取决于它们的声明方式)。

指针变量没有什么神奇之处——就像任何其他标量一样,它们存储某种值;只是在他们的情况下,该值是另一个对象的地址。

如果您真的希望p 存储自己的地址,则必须执行类似的操作

p = (int *) &p;

强制转换是必要的,因为表达式 &p 的类型是int **,并且您不能将一种类型的指针值分配给不同指针类型的变量。但是,不保证指向不同类型的指针具有相同的大小、表示或对齐方式。在 x86 等现代商品硬件上,您可能可以指望 int *int ** 具有相同的大小和表示形式,但请注意,并非必须在任何地方都是如此。

【讨论】:

    【解决方案2】:

    指针和其他变量一样是变量。它有一个地址,通常是该变量所在的内存地址。

    与任何其他变量一样,指针变量也包含一些数据。对于指针变量,该数据是某个其他变量的地址,即指针指向的变量。

    变量的地址和变量的内容是两个完全不同的东西。它们几乎永远不会相等。

    试试这个程序,在其中我给你的变量p 一些指向:

    int main()
    {
        int i = 5;
        int *p = &i;
    
        printf("p: %p, p's address: %p\n", p, &p);
        printf("i: %d, i's address: %p\n", i, &i);
    }
    

    你应该注意到两件事:

    1. 在您的第一个程序中,“p”和“p 的地址”会有所不同。
    2. 无论您看到“p”的值是多少,它都与“i 的地址”相同。

    【讨论】:

    • IMO 最佳答案。一个小问题:%p 需要一个空指针,所以应该有&p&i 的演员表
    【解决方案3】:

    假设有一个随机内存块来理解它的名字a。现在假设p 指向那个内存块。

    &p 返回存在p 的内存块的地址。

    p将内存块(&a)的地址返回给p指向的变量/内存块(a)。

    所以当然会给出不同的内存地址。

    【讨论】:

      【解决方案4】:

      原因是指针在声明时默认不指向自身。简化后,您可以将其想象成一个指针占用 2 个内存单元。 1 个内存单元具有指针本身所在的虚拟地址(在您的情况下为 &p),第 2 个内存单元包含指针指向的虚拟地址(在您的情况下为 p)。

      由于内存单元在释放时仍保留其值,因此包含指针目标地址的单元仍包含来自另一个已完成进程的过时值。

      如果你声明一个新的整数变量,然后用 printf 打印它的值,你会遇到同样的现象,你会看到新变量中已经有一些数字看起来是完全随机的。这也是因为对应的内存单元中还有一个过时的值。

      【讨论】:

      • 请准确回答。
      【解决方案5】:

      指针是一个普通对象(在您的情况下类型为int *)。它不能指向自己,因为这种指针的类型必须是int **

      *图片从互联网上窃取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 2016-02-08
        • 2021-12-24
        相关资源
        最近更新 更多