types - 在printf中,%p 格式说明符需要显式转换为 void*的所有类型,但 char*

  显示原文与译文双语对照的内容
126 3

关于 %p 格式,我已经阅读了很多关于格式说明符用法的答案,但似乎没有任何解释说明为什么所有类型都需要显式转换到 void*,而不是使用 java 。
我当然知道,这个要求,转换到或者从 void*的使用与可以变性函数( 请参见这里答案的第一个注释。),而不是必要的。

下面是一个示例:

int i; 
printf ("%p", &i);

产生关于类型不兼容问题的警告,并且 &i 应强制转换为 void* ( 根据标准要求,请再次查看这里的 。) 。

尽管这里代码块可以顺利编译,但对类型转换没有任何要求:

char * m ="Hello"; 
printf ("%p", m);

为什么 char* 是这个命令的"松开"?

:::::在linux上,作为指针类型大小依赖于它,并使用 gcc作为编译器,这可能值得一点。-W -Wall -std=c11 -pedantic编译选项。

时间:原作者:0个回答

56 0

char* 类型的参数不需要显式转换,因为 char * 具有与 void * 相同的表示和对齐要求。

引用 C11,第六章 §6.2 5

指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求。( 48 ) [... ]

和脚注 48 )

相同的表示和对齐要求意味着可以互换性作为函数的参数。函数的返回值和联合的成员。

原作者:
...