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

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 =

我试图理解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 = [%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 );