为什么C程序在打印指针时会给我这个输出?

ali*_*sha -4 c printf pointers

#include <stdio.h>

int main()

{
    int i;
    int buf[10];
    char *p ;
    p = 4;
    printf("%d",p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

4

怎么会是4?我期待一些地址价值.你能帮我理解一下吗?

das*_*ght 5

这是未定义的行为,因为%d需要一个整数.

你看到这个输出的原因是指针有足够的容量来存储小的整数,例如4.如果巧合的是你的系统上的指针大小与整数的大小相匹配,printf会找到它所期望的位置的表示它期望它,因此它将打印指针的数值.

打印指针的正确方法是使用%p格式说明符和强制转换:

printf("%p", (void*)p);
Run Code Online (Sandbox Code Playgroud)

我期待一些地址价值.

如果您分配了p一些地址,您将获得一个地址值.例如,如果你这样做了

char buf[10];
char *p = &buf[3];
printf("%p", (void*)p);
Run Code Online (Sandbox Code Playgroud)

你会buf在索引3 看到's元素的地址.

演示.