c语言——函数指针

  函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码。一个函数的地址是该函数的进入点,也是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数。

      不带括号和变量列表的函数名,这可以表示函数的地址,正如不带下标的数组名可以表示数组的首地址。

定义形式:

        类型 (*指针变量名)(参数列表);

例如:

        int (*p)(int i,int j);

    p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和*结合,表明p是一个指针。然后再与()结合,表明它指向的是一个函数。指向函数的指针也称为函数指针。

        例1:

 
  1. #include <stdio.h>

  2.  
  3. #define GET_MAX 0

  4. #define GET_MIN 1

  5.  
  6. int get_max(int i,int j)

  7. {

  8. return i>j?i:j;

  9. }

  10.  
  11. int get_min(int i,int j)

  12. {

  13. return i>j?j:i;

  14. }

  15.  
  16. int compare(int i,int j,int flag)

  17. {

  18. int ret;

  19.  
  20. //这里定义了一个函数指针,就可以根据传入的flag,灵活地决定其是指向求大数或求小数的函数

  21. //便于方便灵活地调用各类函数

  22. int (*p)(int,int);

  23.  
  24. if(flag == GET_MAX)

  25. p = get_max;

  26. else

  27. p = get_min;

  28.  
  29. ret = p(i,j);

  30.  
  31. return ret;

  32. }

  33.  
  34. int main()

  35. {

  36. int i = 5,j = 10,ret;

  37.  
  38. ret = compare(i,j,GET_MAX);

  39. printf("The MAX is %d\n",ret);

  40.  
  41. ret = compare(i,j,GET_MIN);

  42. printf("The MIN is %d\n",ret);

  43.  
  44. return 0 ;

  45. }

        例2:

 
  1. #include <stdio.h>

  2. #include <string.h>

  3.  
  4. void check(char *a,char *b,int (*cmp)(const char *,const char *));

  5.  
  6. main()

  7. {

  8. char s1[80],s2[80];

  9. int (*p)(const char *,const char *);

  10.  
  11. //将库函数strcmp的地址赋值给函数指针p

  12. p=strcmp;

  13.  
  14. printf("Enter two strings.\n");

  15. gets(s1);

  16. gets(s2);

  17.  
  18. check(s1,s2,p);

  19. }

  20.  
  21. void check(char *a,char *b,int (*cmp)(const char *,const char *))

  22. {

  23. printf("Testing for equality.\n");

  24. //表达式(*cmp)(a,b)调用strcmp,由cmp指向库函数strcmp(),由a和b作调用strcmp()的参数。

  25. //调用时,与声明的情况类似,必须在*cmp周围使用一对括号,使编译程序正确操作,

  26. //同时这也是一种良好的编码风格,指示函数是通过指针调用的,而不是函数名。

  27. if((*cmp)(a,b)==0)

  28. printf("Equal\n");

  29. else

  30. printf("Not Equal\n");

  31. }


        例3:

 
  1. #include <stdio.h>

  2. #include <ctype.h>

  3. #include <stdlib.h>

  4. #include <string.h>

  5.  
  6. //check()函数的第3个函数是函数指针,就可以根据具体情况传入不同的处理函数

  7. void check(char *a,char *b,int (*cmp)(const char *,const char *));

  8.  
  9. //自定义的比较两个字符串的函数

  10. int compvalues(const char *a,const char *b);

  11.  
  12. main()

  13. {

  14. char s1[80],s2[80];

  15.  
  16. printf("Enter two values or two strings.\n");

  17. gets(s1);

  18. gets(s2);

  19.  
  20. //如果是数字,则用函数指针传入数字比较函数进行处理

  21. if(isdigit(*s1)){

  22. printf("Testing values for equality.\n");

  23. check(s1,s2,compvalues);

  24. }

  25. //如果是字符串,则用函数指针传入库函数strcmp进行处理

  26. else{

  27. printf("Testing strings for equality.\n");

  28. check(s1,s2,strcmp);

  29. }

  30. }

  31.  
  32. void check(char *a,char *b,int (*cmp)(const char *,const char *))

  33. {

  34. if((*cmp)(a,b)==0)

  35. printf("Equal.\n");

  36. else

  37. printf("Not Equal.\n");

  38. }

  39.  
  40. int compvalues(const char *a,const char *b)

  41. {

  42. if(atoi(a)==atoi(b))

  43. return 0;

  44. else

  45. return 1;

  46. }


注意:

        int *f(int i, int j);

        int (*p)(int i, int j);

    前者是返回值是指针的函数;后者是一个指向函数的指针。

猜你喜欢

转载自blog.csdn.net/xiaobaixiongxiong/article/details/82960962