想象一下,我有这个
main() {
int a = 5;
int *p;
printf("p: %d", (void*)p);
}
为什么我必须在printf语句中强制转换* p?但如果我这样做......
p = &a;
printf("p: %d", *p);
这次我没有演员?
所以我的问题是我是否需要每次都将void转换为空指针?
答案 0 :(得分:2)
在第一个示例中,您正在打印指针本身的值,但是使用了错误的格式说明符。
printf("p: %d", (void*)p);
应该是
printf("p: %p", (void*)p);
原因是,int
指定的%d
可能与指针的大小不同。转换的原因是因为%p
打印了void*
指针的值。但请注意:在您的示例中,int *p
是未初始化的,因此打印其值是无用的。
在第二个示例中,您将通过指针打印指向的值,并且不需要强制转换,因为类型是一致的。
printf("p: %d", *p);
答案 1 :(得分:0)
要打印出指针值(NULL
或其他),您必须使用%p
转换说明符,该说明符要求其对应的参数具有类型void *
:
printf("p = %p\n", (void *) p );
这可能是C中唯一需要显式将指针值强制转换为void *
的时间(如果它还不是void *
)。原因是printf
如何读取其参数,可变函数中的默认类型促销以及其他一些我尚未弄清楚如何解释的事情的组合。
请注意,您正在转换p
(指针)的值,而不是它指向的值。
在第二份印刷声明中,
printf("*p = %d\n", *p );
您正在打印p
指向的事物的值,这是一个整数。 表达式 *p
的类型为int
,这是%d
转换说明符所期望的。