#include #include #define PI 3.141592653 double (* make_something(double multiple))(double) { double return_double(double x){ // This is incide make_something's stack frame! return multiple*x; } return return_double; } double (* return_tangent())(double) { return tan; } void run_on_angles(double (*tf)(double)){ double values[] = {0, PI/2, PI, PI*1.5, 2*PI}; for(int i = 0; i < 5; i++) printf("tf(%lf) = %lf\n", values[i], tf(values[i])); } int main(){ double (*trig_function)(double) = sin; printf("tf of 3.14: %lf\n", trig_function(3.14)); trig_function = cos; printf("tf of 3.14: %lf\n", trig_function(3.14)); trig_function = return_tangent(); printf("tf of 3.14: %lf\n", trig_function(3.14)); run_on_angles(sin); trig_function = make_something(); printf("tf of 3.14: %lf\n", trig_function(3.14)); // Normal for C: // type variable_name = value; // function types don't follow this model! // return_type_of_the_function (*name_of_the_variable)(parameters_for_the_function) = value; double (*trig_functions[])(double) = {sin, cos, tan}; for(int i = 0; i < 3; i++) run_on_angles(trig_functions[i]); return 0; }