C printf(“%p”,int 1)是什么意思?
我试图理解int a和int*a之间的区别,我的第一步是查看通过int a的printi%p可以得到的值。当然,编译器会显示警告,但会完成以下代码的工作C printf(“%p”,int 1)是什么意思?,c,pointers,C,Pointers,我试图理解int a和int*a之间的区别,我的第一步是查看通过int a的printi%p可以得到的值。当然,编译器会显示警告,但会完成以下代码的工作 #include <stdio.h> int main() { int a; printf("a - declared"); printf("int a = [%d]\n", a); // example - 1745899614 printf("int a pointer =
#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,对于int a的值%p,它等于十六进制的10。但实际上是int指向该地址的情况,还是编译器在这种情况下试图理解%p
为int分配的内存在哪里?如何对此进行测试?要打印名为a的对象的地址,请使用: 仅使用%p不会告诉printf打印用作参数的对象的地址。您必须使用“address of”操作符&来获取地址。否则,将a的值传递给printf,而不是a的地址 此外,如上所示,将地址转换为void*是合适的,因为%p说明符需要指向void的指针。在许多C实现中,其他类型的指针通常有效或似乎有效,但技术要求是传递指向void的指针 但实际上是int指向那个地址,还是 这就是编译器在这种情况下试图理解%p的原因吗 是后者。编译器尝试将整数解释为指针。当您使用%p打印a的值时,编译器发现a的类型为int,并警告您它不是指针 要打印用户的地址,请执行以下操作: 如果a是指针,例如int*a;然后,您需要使用有效地址对其进行初始化,然后才能打印:
printf("int a pointer = [%p]\n", (void*)a);
%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).
我想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 );
这意味着你打错了你的程序。它应该是printfint a指针=[%p]\n,&a;注意:符号AND.const void*与void*不兼容。C99 6.7.3:9规定“对于要兼容的两种合格类型,两种类型都应具有兼容类型的相同合格版本;类型限定符在一个或多个限定符列表中的顺序不影响指定类型”。有时明确允许限定符模糊性,例如在6.5:7中的第二项中,但如果您有理由认为C99允许将常量void*传递给%p,我将对您的推理非常感兴趣。最近我一直在试图回答这个问题,但我不清楚。@PascalCuoq:错误文本已删除。@EricPostphil谢谢!最好的答案+评论组合在这个线程上。
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 );