我试图了解C中的强制转换。我在IDEONE中尝试this code并且没有任何错误:
#include <stdio.h>
int main(void) {
int i=1;
char c = 'c';
float f = 1.0;
double* p = &i;
printf("%d\n",*(int*)p);
p = &c;
printf("%c\n",*(char*)p);
p = &f;
printf("%f\n",*(float*)p);
return 0;
}
但是当在C ++编译器here 上编译时,我遇到了这些错误:
prog.cpp:9:15: error: cannot convert 'int*' to 'double*' in initialization
double* p = &i;
^
prog.cpp:11:4: error: cannot convert 'char*' to 'double*' in assignment
p = &c;
^
prog.cpp:13:4: error: cannot convert 'float*' to 'double*' in assignment
p = &f;
^
这与我目前所知的相符;也就是说,我不能(在C ++中)将不兼容的类型分配给任何指针,只能分配给void *
,就像我here一样:
#include <stdio.h>
int main(void) {
int i=1;
char c = 'c';
float f = 1.0;
void* p = &i;
printf("%d\n",*(int*)p);
p = &c;
printf("%c\n",*(char*)p);
p = &f;
printf("%f\n",*(float*)p);
return 0;
}
现在,如果此代码在C中运行得非常好,为什么我们需要一个void
指针?我可以使用任何我想要的指针,然后在需要时投射它。我读到void
指针有助于使代码通用,但如果我们将char *
视为默认指针,那么可以实现,不是吗?
答案 0 :(得分:2)
尝试使用严格的ANSI C编译器编译代码,从C89到C11,您将得到相同的错误:
Test.c(9): error #2168: Operands of '=' have incompatible types 'double *' and 'int *'.
Test.c(11): error #2168: Operands of '=' have incompatible types 'double *' and 'char *'.
Test.c(13): error #2168: Operands of '=' have incompatible types 'double *' and 'float *'.
我认为在线编译器有些修剪以接受任何代码也可以预先安装
C仍然是弱类型语言,但实际标准级别不接受此类错误
C ++是更强大的类型语言(它需要它才能工作),所以即使是在线compielr也会给你错误
需要一个通用指针,void *
,绝对需要充当一个可互换的通用指针。