"%p 格式说明符的参数类型是 'void*'"是什么意思?

What do we mean by "argument type for %p format specifier is "void*"?

本文关键字:void 意思 是什么 格式 说明符 参数 类型      更新时间:2023-10-16

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

我从以下链接获得了问题中的声明:

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

%u格式与sizeof(void *) == sizeof(unsigned)一样"有效",这通常适用于32位代码,但不适用于64位代码。如果你想控制格式(你无法控制%p的外观),那么你需要使用C99:中的<inttypes.h>

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

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

严格地说,如果要使用%p,则(a)应通过强制转换确保堆栈上的值实际上是void *(因为fprintf()等是可变函数,转换不会自动发生),以及(b)该格式没有跨平台标准。它通常等价于没有0x前缀的小写十六进制;一些系统生成CCD_ 19前缀。在实践中,通过int *通常是安全的。

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

是的,它用于打印指针所包含的地址。它适用于任何指针类型。

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

printf("%p", (void*)&x);