让我们考虑C语言中的以下两个程序
计划#1
#include<stdio.h>
int main ()
{
int x = 5;
int *px;
px = &x;
printf ("&x = %p\n", &x);
printf ("px = %p\n", px);
return 0;
}
计划#2
#include<stdio.h>
int main()
{
int x = 5;
int *px = NULL;
px = &x;
printf("&x = %p\n", (void *)&x);
printf("px = %p\n", (void *)px);
return 0;
}
编译完成后,我的两个程序都没有错误。但在编译#1 后,我收到以下警告
格式'%p'需要'void *'类型的参数,但参数2有类型 'int *'
在搜索堆栈交换之后,我得到了(void *)是一个通用指针,但我怀疑的是,我将px声明为int的指针变量,那么为什么我需要转换为泛型指针而不是(int *)。为什么%p无法在没有类型转换的情况下处理(void *)?
每当我打印地址或指针以获得零警告时,是否需要转换为通用指针?