void pointers next: structures up: pointers previous: function pointers
contents
index
void pointers at first glance, a void pointer seems to be of limited, if any, use. however, when combined with the ability to cast such a pointer to another type, they turn out to be quite useful and flexible. consider the example of the previous section, where we constructed a function pointer to a function of type void and argument int. such a function pointer in this form could not be used for a void function with a different type of argument (for example, float). this can be done, however, through the use of void pointers, as the following example illustrates. #include <stdio.h> void use_int(void *); void use_float(void *); void greeting(void (*)(void *), void *); int main(void) { char ans; int i_age = 22; float f_age = 22.0; void *p; printf("use int (i) or float (f)? "); scanf("%c", &ans); if (ans == 'i') { p = &i_age; greeting(use_int, p); } else { p = &f_age; greeting(use_float, p); } return 0; } void greeting(void (*fp)(void *), void *q) { fp(q); } void use_int(void *r) { int a; a = * (int *) r; printf("as an integer, you are %d years old.\n", a); } void use_float(void *s) { float *b; b = (float *) s; printf("as a float, you are %f years old.\n", *b); } although this requires us to cast the void pointer into the appropriate type in the relevant subroutine (use_int or use_float), the flexibility here appears in the greeting routine, which can now handle in principle a function with any type of argument. this will especially become apparent when we discuss structures in the next section.