这是我的C代码:
int main()
{
void * ptr_void;
void ** ptr_2void;
ptr_void = ptr_2void;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道为什么这段代码有效?我已经分配了一个(void *)
to (void **)
,编译器甚至在没有警告的情况下传递它.这种类型看起来不匹配.和下面的代码指派(void **)
给(int *)
也有效.
int main()
{
int * ptr_int;
void ** ptr_2void;
ptr_int = ptr_2void;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何人都能弄清楚究竟是什么(void *)
东西?
Dee*_*epu 11
void指针的类型转换为隐式指向任何其他数据类型的指针.编译器不会显示任何警告.类似地,从任何类型的指针转换为void *
也可以在没有警告的情况下工作.
除了void指针之外,如果您尝试隐式地从一种指针类型转换为另一种指针类型,则编译器将发出警告.
例如,考虑下面给出的代码,它会给你警告" assignment from incompatible pointer type
".
int *intptr;
void *voidptr;
void **vvptr;
int intval=123;
voidptr=&intval;
vvptr=voidptr;
intptr=vvptr;
Run Code Online (Sandbox Code Playgroud)
导致警告的代码行是intptr=vvptr;
因为intptr
是一个integer pointer
并且vvptr
是类型的指针void **
.它们都不是void *
指针,因而是一个警告.
为了避免此警告,您必须显式地键入强制转换void **
要int *
键入的类型.如果将行更改为intptr=vvptr;
,intptr=(int *)vvptr;
则编译器将不会显示警告.