Advertencia de compilación para vacío ** y vacío *

Tengo una pregunta con respecto avoid* yvoid** y sé que esta es una pregunta antigua y que se ha hecho (algo) antes en stackoverflow. Entonces la pregunta es la siguiente:

Cuando compilo este código con gcc 4.4.3 en ubuntu 10.10, aparece la siguiente advertencia:

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 **’

por qué es correcto pasar la variable x como argumento de foo () pero no está bien pasar la variable y como argumento de bar (). Puedo solucionar esto al convertir explícitamente ambas variables envoid* yvoid** como se esperaba

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;
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta