- 函数会占用一块存储空间,所以函数也有自己的地址
- 函数的地址保存在函数名中,函数名就是函数的地址(数组名就是数组的地址);
函数指针的定义方式
return_Type (*functionP)(arg_type);* : 表示一个指针;functionP : 表示指针的变量名称;(*functionP) : 表示将来指向一个函数;return_Type : 表示指向的函数返回值类型;(arg_type) : 表示指向的函数参数类型;
void test(){ printf("test被执行了\n");/*void (*functionP)(); * : 表示一个指针; functionP : 表示指针的变量名称; (*functionP) : 表示将来指向一个函数; void : 表示指向的函数没有返回值; () : 表示指向的函数没有参数*/}int getAge(){ return 30;}void sum(int v1, int v2){ int res = v1 + v2; printf("res = %i\n", res);}int sum2(int v1 , int v2){ int res = v1 + v2; return res;}int main(int argc, const char * argv[]) { printf("test_p = %p\n",test);//0x100003f10 //没有返回值,没有参数 void(*test_P)(void); //void(*test_P)(void) = test; test_P = test; test_P(); //有返回值,没有参数 int (*ageP)(); ageP = getAge; printf("age = %i\n", ageP()); //有参数,没有返回值 void (*sumP)(int, int); sumP = sum; sumP(10, 20); //有返回值,有参数 int (*sumP2)(int , int); sumP2 = sum2; printf("sum = %i\n", sumP2(10, 20)); return 0;}
函数作为参数
int sum(int v1, int v2){ return v1 + v2;}int minus(int v1, int v2){ return v1 - v2;}/// action方法/// @param v1 V1/// @param v2 V2/// @param function 函数指针int action(int v1,int v2,int(*function)(int,int)) { int result = function(v1,v2); return result;}int main(int argc, const char * argv[]) { int(*function_1)(int,int) = sum; int(*function_2)(int,int) = minus;// int sum_v = action(10, 20, function_1);// int minus_v = action(20, 10, function_2); int sum_v = action(10, 20, sum); int minus_v = action(20, 10, minus); printf("sum_v = %d,\nminus_v = %d\n",sum_v,minus_v); return 0;}