C语言的十六进制输出问题

#为何C语言的十六进制输出不全?,按理说第一个输出应该和第二个和第四个一样啊

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include



int main()
{
    int i = 10;
    int* p = &i;
    printf("p=%X\n", p);
    printf("p=%p\n", p);
    printf("p=%p\n", &p);
    printf("a=%p\n", &i);

}

img

该回答引用ChatGPT

在C语言中,%X是将整数格式化为十六进制的输出格式符号,它会输出一个无符号整数的十六进制表示,但并不保证输出的位数相同。具体来说,%X输出的位数由系统的整数位数决定,通常是4或8个十六进制数字。

对于指针类型,输出的十六进制值表示指针所指向的内存地址,这个地址的位数也取决于系统的位数,通常是8个十六进制数字。

在你的代码中,由于p是一个指向整型变量i的指针,因此第一个printf语句输出的是指针p所指向的地址,由于系统是64位的,所以输出的位数为8个十六进制数字。而第二个printf语句也是输出指针p所指向的地址,但使用了%p格式符号,这个格式符号会自动根据系统的位数来决定输出的位数。因此,第二个printf语句输出的也是8个十六进制数字的地址。

第三个printf语句输出的是指针变量p本身的地址,也就是&p,因此它输出的是指针变量p在内存中的地址,同样也是8个十六进制数字。

最后一个printf语句输出的是整型变量i的地址,也就是&i,它也是一个8个十六进制数字的地址。

因此,这些输出结果并不相同,而是分别表示了不同的地址。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
C语言中使用 %X 格式符输出指针的值时,会将指针的值转换为无符号十六进制数。然而在不同的编译器和操作系统中,指针占用的字节数可能不同,导致输出结果的长度也会不同。因此,使用 %p 格式符输出指针的值是更加通用和可移植的方式,它会输出指针在内存中的实际地址,不受指针类型和大小的影响。在上述代码中,使用 %p 格式符输出指针的值时,输出结果长度相同,而使用 %X 格式符输出时,第一个输出结果较短,是因为在该编译器和操作系统中,指针占用的字节数较短,只有 8 个字符,而其他两个指针占用的字节数较长,都有 16 个字符。