#include #include int main(){ void *a_pointer; a_pointer = main; printf("a_pointer = %lx\n", a_pointer); int a = 721; a_pointer = &a; printf("a_pointer = %lx\n", a_pointer); printf("a = %d\n", a); // a_pointer points to an integer. Therefore, it's type is: int* *(int*)a_pointer = 563; printf("a = %d\n", a); a_pointer = sin; printf("a_pointer = %lx\n", a_pointer); // a_pointer points to a function that returns a double and takes a double // Therefore, it's type is: double(*)(double) // ( (type) a_pointer )(parameters) printf("The sin of 3.14 is %lf\n", ((double(*)(double))a_pointer)(3.14)); double our_function(double param_name){ return 0.0; } // int a; // int *a; // To cast: (int*) // Another method, especially good if you have to use the casted pointer a few times double (*pointer_to_trig)(double) = a_pointer; // To cast: (double (*)(double)) printf("The sin of 1.57 is %lf\n", pointer_to_trig(1.57)); pointer_to_trig = cos; printf("The cos of 1.57 is %lf\n", pointer_to_trig(1.57)); double (*trig_functions[])(double) = {sin, cos, tan}; a_pointer = trig_functions; // The type: double (**)(double) for(int i = 0; i < 3; i++) printf("function %d given 1.57: %lf\n", i, trig_functions[i](1.57)); printf("Function 2 yields %lf\n", ( (double (**)(double)) a_pointer)[2](3.14)); return 0; }