• 函数会占用一块存储空间,所以函数也有自己的地址
  • 函数的地址保存在函数名中,函数名就是函数的地址(数组名就是数组的地址);

函数指针的定义方式

  1. return_Type (*functionP)(arg_type);
  2. * : 表示一个指针;
  3. functionP : 表示指针的变量名称;
  4. (*functionP) : 表示将来指向一个函数;
  5. return_Type : 表示指向的函数返回值类型;
  6. (arg_type) : 表示指向的函数参数类型;
  1. void test()
  2. {
  3. printf("test被执行了\n");
  4. /*
  5. void (*functionP)();
  6. * : 表示一个指针;
  7. functionP : 表示指针的变量名称;
  8. (*functionP) : 表示将来指向一个函数;
  9. void : 表示指向的函数没有返回值;
  10. () : 表示指向的函数没有参数
  11. */
  12. }
  13. int getAge()
  14. {
  15. return 30;
  16. }
  17. void sum(int v1, int v2)
  18. {
  19. int res = v1 + v2;
  20. printf("res = %i\n", res);
  21. }
  22. int sum2(int v1 , int v2)
  23. {
  24. int res = v1 + v2;
  25. return res;
  26. }
  27. int main(int argc, const char * argv[]) {
  28. printf("test_p = %p\n",test);//0x100003f10
  29. //没有返回值,没有参数
  30. void(*test_P)(void);
  31. //void(*test_P)(void) = test;
  32. test_P = test;
  33. test_P();
  34. //有返回值,没有参数
  35. int (*ageP)();
  36. ageP = getAge;
  37. printf("age = %i\n", ageP());
  38. //有参数,没有返回值
  39. void (*sumP)(int, int);
  40. sumP = sum;
  41. sumP(10, 20);
  42. //有返回值,有参数
  43. int (*sumP2)(int , int);
  44. sumP2 = sum2;
  45. printf("sum = %i\n", sumP2(10, 20));
  46. return 0;
  47. }

函数作为参数

  1. int sum(int v1, int v2)
  2. {
  3. return v1 + v2;
  4. }
  5. int minus(int v1, int v2)
  6. {
  7. return v1 - v2;
  8. }
  9. /// action方法
  10. /// @param v1 V1
  11. /// @param v2 V2
  12. /// @param function 函数指针
  13. int action(int v1,int v2,int(*function)(int,int)) {
  14. int result = function(v1,v2);
  15. return result;
  16. }
  17. int main(int argc, const char * argv[]) {
  18. int(*function_1)(int,int) = sum;
  19. int(*function_2)(int,int) = minus;
  20. // int sum_v = action(10, 20, function_1);
  21. // int minus_v = action(20, 10, function_2);
  22. int sum_v = action(10, 20, sum);
  23. int minus_v = action(20, 10, minus);
  24. printf("sum_v = %d,\nminus_v = %d\n",sum_v,minus_v);
  25. return 0;
  26. }