gpt4 book ai didi

c - 格式字符串中的 %p 与 %x

转载 作者:行者123 更新时间:2023-11-30 18:45:30 26 4
gpt4 key购买 nike

嗨,我对 C 中的字符串格式有点困惑。有人可以解释一下这里输入的每个打印的输出是什么吗?

printf("%p", pointer);
printf("%x", pointer);
printf("%x", &pointer);

最佳答案

%p意思是“打印一个指针”。您应该向其传递一个已转换为 void * 的指针。 。 %x意思是“打印 unsigned int以十六进制表示。”您应该将 unsigned int 传递给它;向其传递指针是不正确的。

假设我们有:

char *pointer = "Hello";
char array[] = "World";

然后,在:

printf("%p", (void *) pointer);
printf("%p", (void *) array);

pointer的值将以某种实现定义的方式打印。 (它应该显示存储在 pointer 中的地址。)

第二个printf ,数组array将被转换为指向其第一个元素的指针,并且该指针的值将以实现定义的方式打印。

请注意,我将强制转换插入到 (void *) 。这是正确的使用方法%p .

在:

printf("%x", (unsigned) pointer);
printf("%x", (unsigned) array);

pointer的值将转换为unsigned int 。此转换的结果是实现定义的。这应该不足为奇,但它可能与您在 %p 中看到的不同。 。此外,unsigned int可能太窄而无法包含指针的完整值,在这种情况下,一些信息将会丢失。

转换后,第一个语句将以十六进制打印值(没有前导“0x”,而使用 %p 通常包含前导“0x”)。第二条语句将再次转换 array指向其第一个元素的指针,然后将其转换为 unsigned int ,然后以十六进制打印它。

如果unsigned int如果足够宽,则此方法打印的值有可能(甚至不太可能)显示与 %p 所示相同的十六进制值。方法,但你不能依赖它。

请注意,使用 %x 打印这些内容没有转换为 unsigned具有 C 标准未定义的行为 - 传递 %x 的指针是错误的规范。您必须先将其转换。您的原始代码,如果没有强制转换,可能会导致打印的值来自与指针无关的某些任意数据,或者它可能导致您的程序中止,或者它可能打印了正确的地址,或者它可能已经完成其他东西——行为未定义。

在:

printf("%x", (unsigned) &pointer);
printf("%x", (unsigned) &array);

pointer的地址,而不是它的值,将被转换为 unsigned int然后以十六进制打印。这几乎肯定会与打印 pointer 的结果不同。 .

对于&array ,数组的地址将被转换为unsigned 。与之前的陈述不同,array不转换为指向其第一个元素的指针。这是因为&是抑制这种转换的特殊运算符。它返回数组的地址。

数组的地址与其第一个元素的地址“相同”,因为在内存中,数组从其第一个元素开始的位置开始。但是,指针可能有不同的表示形式,并且有可能将 &array 转换为至unsigned int可能会产生与转换 array 不同的值至unsigned int 。尽管如此,在大多数 C 实现中,它们产生相同的值,因此您将看到 printf("%x", (unsigned) &array); 的相同结果。正如您对 printf("%x", (unsigned) array); 所做的那样.

关于c - 格式字符串中的 %p 与 %x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54497890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com