%p是否将变量的地址作为指针打印,还是打印出指向的内容?

时间:2013-12-02 00:18:21

标签: c pointers printf

我现在已经阅读了至少十几篇关于%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 );
    }
}

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:2)

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

通常,如果没有使用&运算符明确获取地址,函数就无法获取变量的地址。因此,如果您想打印p的地址,则必须执行此操作:

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

答案 2 :(得分:1)

有了这种疑问,它通常会帮助我打印地址和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

mem中的x地址值:-1079190472

p值:-1079190472

mem中p地址的值:-1079190468

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

答案 3 :(得分:0)

当我们说

时会打印x的地址
int *p=&x;

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

int *p;
p=&x;

因此p会存储x的地址。