李 *_* 慕 13 c pointers void-pointers format-specifiers
我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符.它为什么以及究竟是什么问题?
int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
Run Code Online (Sandbox Code Playgroud)
内部表示或不同指针类型的大小不一定相同.
例如,在一个系统上sizeof(void*)可能是2,但是sizeof(int*)是1.
由于printf是变量参数函数,因此无法检查传入参数的类型.如果你传递int*给它,它将读取错误的字节数,因为它期望void*.
p转换规范printf需要一个类型的参数void *.C表示如果传递其他类型的参数,则调用将调用未定义的行为.
除此之外,不要求不同类型的指针对象具有相同的表示:sizeof (void *) == sizeof (int *)例如,C不保证.C只保证void *与字符类型的指针具有相同的表示.