printf(“%p”,int 1)是什么意思?

时间:2013-11-13 17:12:03

标签: c pointers

我正在尝试理解int aint *a之间的区别,我的第一步是看到我可以通过%p的原始int a得到的价值。当然,编译器会显示警告,但会完成以下代码的作业。

#include <stdio.h>

int main() {
    int a;
    printf("a - declared");
    printf("int a = [%d]\n", a);            // example - 1745899614
    printf("int a pointer = [%p]\n", a);    // example - 0x6810505e

    a = 10;
    printf("a - initialized to value of 10\n");
    printf("int a = [%d]\n", a);            // exmaple - 10
    printf("int a pointer = [%p]\n", a);    // example - 0xa

    return 0;
}

正如我在源代码中提到的,0xa得到了一个令人满意的结果,它等于{16}的10 %p的{​​{1}} {1}}。但实际情况是int a指向该地址的情况,还是这只是编译器在这种情况下试图理解int

%p s分配的内存在哪里?我该如何测试?

4 个答案:

答案 0 :(得分:4)

要打印名为a的对象的地址,请使用:

printf("The address of a is %p.\n", (void *) &a);

仅使用%p并不会告诉printf打印您用作参数的对象的地址。您必须使用“地址”运算符&来获取地址。否则,您将a的值传递给printf,而不是a的地址。

此外,将地址转换为void *是正确的,如上所示,因为%p说明符需要指向void的指针。其他类型的指针在许多C实现中经常工作(或似乎工作),但技术要求是传递指向void的指针。

答案 1 :(得分:2)

我认为formater(在printf中)只是在解释内存时告诉它。所以是的,“%p”用于指针,但你给它一个int。你想给它一个地址:

printf( "%p", &a );

整个shabang:

int  a = 10;
int *b = &a;

printf("value of    a: %d\n", a  );
printf("location of a: %p\n", &a );
printf("value of    b: %p\n", b  );
printf("location of b: %p\n", &b );
printf("dereference b: %d\n", *b );

答案 2 :(得分:1)

  

但实际上是int指向该地址的情况,或者是   这只是编译器在这种情况下试图理解%p?

这是后者。编译器尝试将整数解释为指针。使用a编译器打印%p时,发现a的类型为int,并警告您它不是指针。

打印a使用地址

printf("int a pointer = [%p]\n", (void*)&a);   

如果a是指针(e..g int *a;),则需要使用有效地址对其进行初始化,然后才能打印:

printf("int a pointer = [%p]\n", (void*)a); 

答案 3 :(得分:1)

%p只是告诉printf将您的值打印为地址内存的一种方法。您将10的值传递给它(a的值),并以十六进制表示法0xa打印此值。没有特别的解释,它只是一种格式化选项。

如果您希望打印a的地址存储器的值,则可以执行printf("%p", &a);&aa的地址。

或者如果你想使用指针:

int* p;
p = &a;
printf("%p", p); //Prints the p value, that is the a address. Equivalent to printf("%p", &a).