【问题标题】:Does %p print the address of the variable as a pointer, or does it print what it points to?%p 是否将变量的地址打印为指针,还是打印它指向的内容?
【发布时间】:2013-12-02 00:18:21
【问题描述】:

我现在已经阅读了至少十几篇关于 %p 的文章,但我仍然没有得到明确的答案。我意识到网站上有很多关于这个的帖子,我读了很多。 I even read this article, but it did not explain it adequately

说我有:

int x = 10;
void *p = &x;

下面的语句是打印出'p'的地址还是'x'的地址?

printf( "Here: %p\n" , p );

我正在尝试通过p获取x的地址。


对于某些上下文,我正在迭代堆栈以寻找指向我创建的链表的指针:

void foo(){

    register void* base asm("ebp");
    void* iter = base;

    void* mBase = MAIN_BASE; //global defined as "register void* base asm("ebp")" in main function

    void* start = &head;
    void* fin = &tail + sizeof( tail );

    while( iter != mBase ){

        if( iter >= start && iter <= fin )
            fprintf( stdout, ">>>>%p\n", iter );

        printf("iter: %p\n", iter );
        iter = (void*)( (char*)iter + 1 );
    }
}

【问题讨论】:

  • 打印变量“p”的值,即“p”所指向的东西的地址。
  • 对吗?因为在我提供的示例中,“iter”的打印总是按顺序排列,如果它返回指针的目标,我不应该看到一些变化吗?
  • 谁说p 必须存储在堆栈中?您的编译器可能会对其进行优化,并且只会将 p 存储在寄存器中。
  • 有两个例子,我说的是iter,不是p
  • “指针的目标”是指针值寻址的存储位置。当您将 iter 增加 1 时,打印的地址将增加 1。(当然,该地址处的“对象”可能不是任何类型的有效对象,实际上甚至可能没有分配存储空间。)

标签: c pointers printf


【解决方案1】:

它打印变量p的内容,恰好是x的地址,所以它打印x的地址。它使用特定架构的地址格式显示它。格式可能因架构而异:存储在远段数据中的变量,可以使用生成 MS DOS 实模式可执行文件的 C 编译器以完全不同的格式打印,例如 025A:0008 或类似的东西。

【讨论】:

    【解决方案2】:

    语句打印x 的地址,因为这是存储在p 中的值。当然p 不需要是有效的,也不需要特别指向任何东西。

    一般来说,如果没有使用&amp; 运算符显式获取地址,函数就无法获取变量的地址。所以如果你想打印p的地址,你必须这样做:

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

    【讨论】:

    • 当然,“p”在一般情况下完全有可能不指向任何现有对象。
    【解决方案3】:

    有了这种疑问,通常可以帮助我打印 p 和 x 的地址和值。 我试过这段代码:

    #include <stdio.h>
    
    void main()
    {
        int x = 10;
        void *p = &x;
    
        printf("value of x : %d\n", x);
        printf("value of x address in mem: %d\n", (int) &x);
        printf("value of p (integer): %d\n", (int)p);
        printf("value of p address in mem: %d\n", (int) &p);
    
    }
    

    这段代码的输出是:

    x 的值:10

    内存中x地址的值:-1079190472

    p的值:-1079190472

    内存中p地址的值:-1079190468

    可以看到p中存储的值就是x的地址。

    【讨论】:

      【解决方案4】:

      它会打印x的地址,因为当我们说的时候

      int *p=&x;
      

      我们基本上是在做这两个步骤:

      int *p;
      p=&x;
      

      所以p 将存储x 的地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 2020-06-07
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        相关资源
        最近更新 更多