Argument conversion: (normal) pointer to void pointer, cast needed?

Viewed 1219

When assigning to or from a void-pointer no cast is needed (C99 §6.3.2.2 sub 1 / §6.5.16.1 sub 1). Is this also true when passing a (for example int-)pointer to a function that expects a void-pointer?

For example:

void foo(void * p){
    // Do something
}

int main(){
    int i = 12;
    foo(&i); // int * to void *: no cast needed?
}

When I compile this with GCC (4.8.1, MinGW-32) I get neither errors nor warnings (with -Wall & -pedantic).

In contrast in this answer it is suggested that a cast is needed for this call (to eliminate -Wformat warnings):

int main(){
    int i = 12;
    printf("%p\n", &i);
}

But in my case GCC doesn't complain.

So: are casts needed when passing a non-void-pointer to a function that expects a void-pointer?

1 Answers
Related