"%p 格式说明符的参数类型是 'void*'"是什么意思?
What do we mean by "argument type for %p format specifier is "void*"?
到目前为止,为了打印出我所拥有的指针(地址)的值,(正确或不正确)使用了%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);
- "Warning : No return statement in function returning non-void"是什么意思?
- 退货<void>是什么意思?
- (void *)1 是什么意思
- "conversion from void to non scalar type string"是什么意思?
- :void setData(const Color * & data_ptr)中的 *& 是什么意思;
- void() 用作模板参数时是什么意思
- bind(<void>ref(acc), _1) 是什么意思?
- *(void**)是什么意思
- "%p 格式说明符的参数类型是 'void*'"是什么意思?
- VOID NTAPI是什么意思?在哪里可以找到它的参考资料
- 除以大小(void *)是什么意思
- std::swap(*(void **)x, *(void **)y)y是什么意思
- std::_Bind<std::_Mem_fn<void (ClassName::*)()>(ClassName*)>是什么意思?(C++)
- "void f(int (*)[7]) {}"是什么意思?
- void(*)()在代码中是什么意思
- 'typename Enable = void'是什么意思?
- "Invalid operands to binary expression (ostream and void)"是什么意思,如何解决?
- *(void**)是什么意思
- "void();"作为单独的语句在C++中是什么意思?
- *&in void headInsert(DoubleLinkList*&head, int theData)是什么意思。是否等同于 void headInsert(DoubleLinkList he