我正在尝试理解int a
和int *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分配的内存在哪里?我该如何测试?
答案 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);
。 &a
是a
的地址。
或者如果你想使用指针:
int* p;
p = &a;
printf("%p", p); //Prints the p value, that is the a address. Equivalent to printf("%p", &a).