0

我试图了解 和 之间的区别int aint *a我的第一步是查看我可以通过 printi 获得的值%pan 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它等于an10的值的十六进制。但实际上是指向该地址的情况,还是只是编译器试图在这种情况下理解?%pint aint%p

给 s分配的内存在哪里int?我该如何测试呢?

4

4 回答 4

4

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

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

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

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

于 2013-11-13T17:18:41.087 回答
2

我想格式化程序(在 printf 中)只是按照被告知的方式解释内存。所以是的,“%p”是指针,但你给了它一个int。你想给它一个地址:

printf( "%p", &a );

对于整个沙邦:

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 );
于 2013-11-13T17:21:20.783 回答
1

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

是后者。编译器尝试将整数解释为指针。当您打印using的时,编译器会发现is的类型并警告您它不是指针。a%paint

打印使用地址a

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

如果a是指针(例如int *a;),那么您需要使用有效地址对其进行初始化,然后您可以打印:

printf("int a pointer = [%p]\n", (void*)a); 
于 2013-11-13T17:19:53.367 回答
1

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

如果你想a打印地址内存的值,你可以简单地做printf("%p", &a);&a是 的地址a

或者,如果您想使用指针:

int* p;
p = &a;
printf("%p", p); //Prints the p value, that is the a address. Equivalent to printf("%p", &a).
于 2013-11-13T17:19:58.907 回答