2

到目前为止,为了打印出我拥有的指针(地址)的值,(正确或错误地)使用了%u格式说明符。在这方面,说明%p符是什么意思?它是否打印出唯一void*类型的指针的值?我试过这个%p说明符来打印一个整数指针,看起来输出是一个十六进制值。使用%p打印整数或字符指针值是否错误?请告诉我有关%p格式说明符的一些信息。网络资源只让我感到困惑。

我从以下链接中获取了问题中的陈述:

http://www.macs.hw.ac.uk/~rjp/Coursewww/Cwww/format.html

4

3 回答 3

4

格式“%u有效”只要sizeof(void *) == sizeof(unsigned),这通常适用于 32 位代码,但不适用于 64 位代码。如果您想保持对格式的控制(您无法控制 的外观%p),那么您将希望<inttypes.h>从 C99 开始使用:

printf("0x%.8" PRIXPTR "\n", (uintptr_t)&object);

宏 PRIXPTR 为类型值uintptr_t和转换说明符提供正确的长度修饰符X。该类型uintptr_t是一个足以容纳任何指针的整数类型。这.8可确保您打印至少 8 个十六进制数字,但如果地址是 64 位数量并且在值的前导(最高有效)32 位中设置了位,则更多。

严格来说,如果你要使用%p,那么(a)你应该确保堆栈上的值实际上是 avoid *通过强制转换(因为fprintf()et al 是可变参数函数并且转换不会自动发生),并且(b)有该格式没有跨平台标准。0x它通常相当于没有前缀的小写十六进制;一些系统会生成0x前缀。在实践中,您通常可以安全地通过int *.

理论上,在标准 C 中,没有办法打印函数指针。不能保证函数指针与数据指针的大小相同。幸运的是,POSIX 介入并声明在 POSIX 系统上,函数指针的大小应与数据指针的大小相同。因此,至少在 Unix 系统上,事实上在 Windows 系统上,打印数据指针和函数指针是安全的。

于 2012-09-11T02:20:08.273 回答
2

是的,它用于打印指针保存的地址。它适用于任何指针类型。

于 2012-09-11T01:57:10.657 回答
1

void*意思是:“指向内存中某处的指针,但我不知道它指向的是什么类型的内存。” 这就是说明%p符 is的原因void*,因为您只关心内存地址的类型。它旨在用于打印地址。另一方面,%u期望数据为unsigned int,虽然这可能在实践中有效,但有可能void*unsigned int大小不同等,因此不应使用它。此外,正如另一个答案中提到的,即使所有指针都可以转换为void*printf并且可变参数函数系列在技术上不执行这种转换,所以void*应该进行转换:

printf("%p", (void*)&x);
于 2012-09-11T02:46:36.597 回答