无效的目的*

时间:2016-01-16 18:15:36

标签: c pointers types casting

我试图了解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 *视为默认指针,那么可以实现,不是吗?

1 个答案:

答案 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 *,绝对需要充当一个可互换的通用指针。