Вы находитесь на странице: 1из 1

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.

Вам также может понравиться