C void**和void的编译警告*

C void**和void的编译警告*,c,pointers,C,Pointers,我有一个关于void*和void**的问题,我知道这是一个老问题,以前在stackoverflow中被问过(多少)。因此,问题如下: 当我在Ubuntu10.10下使用GCC4.4.3编译这段代码时,我得到以下警告: zz.c: In function ‘main’: zz.c:21: warning: passing argument 1 of ‘bar’ from incompatible pointer type zz.c:9: note: expected ‘void **’ but a

我有一个关于
void*
void**
的问题,我知道这是一个老问题,以前在stackoverflow中被问过(多少)。因此,问题如下:

当我在Ubuntu10.10下使用GCC4.4.3编译这段代码时,我得到以下警告:

zz.c: In function ‘main’:
zz.c:21: warning: passing argument 1 of ‘bar’ from incompatible pointer type
zz.c:9: note: expected ‘void **’ but argument is of type ‘float **’
为什么将变量x作为foo()的参数传递是可以的,而将变量y作为bar()的参数传递是不可以的。我可以通过将这两个变量显式地转换为
void*
void**
来解决这个问题

void foo (void* a){
}

void bar(void **a){
     *a = (float *) malloc(100*sizeof(float));
}

int main (){

    float *x = (float*) malloc(100*sizeof(float));
    foo(x);
    free(x);

    float *y;
    bar(&y);
    free(y);

    return 0;
}

void*a
表示
a
指向未知类型的对象。但是,
a
本身不是未知类型,因为已知
a
具有类型
void*
。只有
a
指向的对象具有未知类型

void**a
表示
a
指向类型为
void*
的对象。
*a
指向的对象具有未知类型,但对象
*a
本身是类型为
void*
的指针


&y
是指向类型为
float*
的对象的指针<代码> & y>代码>不是对一个对象的指针:<代码>空白>代码> .< /p> < p>允许C++将任何指针隐式转换为<代码>空隙*/COD>。但是
void**
void*
不是一回事;它是指向
void*
的指针。因此,它属于常规指针转换的规则(即:禁止使用强制转换,有些例外)。

除了其他答案中的信息外,
void*
在C中充当通用指针类型。它有一些通用的东西:任何指针(指向函数类型的指针除外)可以在不丢失信息的情况下转换为void*,然后再转换回来,指针表达式(同样,不是指向函数的指针)可以隐式转换为
void*
。(C++的规则略有不同。)


您可能认为
void**
是指向指针类型的通用指针,但事实并非如此。它是指向特定类型的指针,即指向
void*
。事实上,C没有指向指针类型的通用指针。但它确实有一个通用指针类型,因此任何试图使用
void**
作为指针类型的通用指针的代码都可能只使用
void*

。。。等待这是有道理的+1,用于可怕的解释。你将如何修正警告?空格栏(浮点**){为什么C++标签?这个问题是纯C。