详解C语言指针函数、函数指针、函数指针数组

àì夳堔傛蜴生んèń 2022-05-20 00:07 451阅读 0赞

在C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是一个必须的过程。而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。

1. 指针函数

指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。

声明形式:type *func (参数列表)

  1. #include <iostream>
  2. using namespace std;
  3. int *GetNum(int x); //指针函数声明形式
  4. void main(void)
  5. {
  6. cout << "===============start================" << endl;
  7. int num;
  8. cout << "Please enter the number between 0 and 6: ";
  9. cin >> num;
  10. cout << "result is:" << *GetNum(num) << endl; //输出返回地址块中的值
  11. system("pause");
  12. }
  13. int *GetNum(int x) {
  14. static int num[] = { 0,1,2,3,4,5,6 };
  15. return &num[x]; //返回一个地址
  16. }

2. 函数指针

函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。

声明形式:type (*func)(参数列表 )

从上面的定义形式可以看出,函数指针和指针函数的直观上区别在于指针符号*与函数名/指针名有没有用括号()包裹起来,从这一点来看是很容易区分两者的。

  1. #include <iostream>
  2. using namespace std;
  3. int max(int a, int b) {
  4. return a>b ? a : b;
  5. }
  6. void main(void)
  7. {
  8. cout << "===========start===========" << endl;
  9. int(*func)(int, int); //定义一个指向该函数形式的指针变量
  10. func = max;
  11. int a, b;
  12. cout << "Please enter two numbers:";
  13. cin >> a >> b;
  14. cout << "max=" << (*func)(a, b) << endl; //运用指针变量调用函数
  15. cout << "max=" << max(a, b) << endl; //使用原函数调用
  16. cout << "max=" << func(a, b) << endl; //使用函数指针名调用,func = max
  17. system("pause");
  18. }

上例给出了函数指针的两种最普遍的调用形式,一个是直接用定义的指针变量(* func)调用,一个是用指针名调用,后者看起来就像是将原函数使用了新名称去调用一样,可以看成函数的别名。再次强调一下:指针变量名和指针符号 * 一定要用括号包裹起来。函数指针还有一种常用的使用方式,就是使用typedef定义后再使用。将上例稍作修改如下:

  1. #include <iostream>
  2. using namespace std;
  3. int max(int a, int b) {
  4. return a>b ? a : b;
  5. }
  6. typedef int(*func)(int, int);
  7. void main(void)
  8. {
  9. cout << "===========start===========" << endl;
  10. func maxfunc = max;
  11. int a, b;
  12. cout << "Please enter two numbers:";
  13. cin >> a >> b;
  14. cout << "max=" << (*maxfunc)(a, b) << endl; //运用指针变量调用函数
  15. cout << "max=" << max(a, b) << endl; //使用原函数调用
  16. cout << "max=" << maxfunc(a, b) << endl; //使用函数指针名调用,func = max
  17. system("pause");
  18. }

3. 函数指针数组

顾名思义,就是每个元素都是函数指针的数组,直接在函数指针名后面加上数组符号[ ]即可。

声明形式:type (*func[ ])(参数列表 )

  1. #include<iostream>
  2. using namespace std;
  3. void fun1()
  4. {
  5. cout << "调用函数fun1" << endl;
  6. }
  7. void fun2()
  8. {
  9. cout << "调用函数fun2" << endl;
  10. }
  11. void fun3()
  12. {
  13. cout << "调用函数fun3" << endl;
  14. }
  15. int main()
  16. {
  17. //定义三个函数指针
  18. void(*pfun)() = &fun1;
  19. void(*pfun2)() = &fun2;
  20. void(*pfun3)() = &fun3;
  21. //接下来就是定义一个数组把他们三个装进去。
  22. void(*pfunarr[3])();
  23. void(*pfunarr[3])();
  24. pfunarr[0] = pfun;
  25. pfunarr[1] = pfun2;
  26. pfunarr[2] = pfun3;
  27. /* 或者这样赋值
  28. pfunarr[0] = &fun1;
  29. pfunarr[1] = &fun2;
  30. pfunarr[2] = &fun3;
  31. */
  32. //调用运行
  33. pfunarr[0]();
  34. pfunarr[1]();
  35. pfunarr[2]();
  36. /* 或者这样调用
  37. (*pfunarr[0])();
  38. (*pfunarr[1])();
  39. (*pfunarr[2])();
  40. */
  41. system("pause");
  42. return 0;
  43. }

4. C语言函数不可以定义为数组,只能通过函数指针来操作定义函数指针数组。

5. 指向函数指针数组的指针

声明形式:type (* (*func )[ ])(参数列表 )

  1. #include<iostream>
  2. using namespace std;
  3. void fun1()
  4. {
  5. cout << "调用函数fun1" << endl;
  6. }
  7. void fun2()
  8. {
  9. cout << "调用函数fun2" << endl;
  10. }
  11. void fun3()
  12. {
  13. cout << "调用函数fun3" << endl;
  14. }
  15. int main()
  16. {
  17. //void(*pfun)() = &fun1;
  18. //void(*pfun2)() = &fun2;
  19. //void(*pfun3)() = &fun3;
  20. //接下来就是定义一个数组把他们三个装进去。
  21. void(*pfunarr[3])();
  22. void(*(*pfunarr2)[3])();
  23. //在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
  24. pfunarr[0] = &fun1;
  25. pfunarr[1] = &fun2;
  26. pfunarr[2] = &fun3;
  27. pfunarr2 = &pfunarr;
  28. (*pfunarr2)[0]();
  29. pfunarr[0]();
  30. system("pause");
  31. return 0;
  32. }

分析其定义形式:void(*(*pfunarr2)[3])()
其中(* pfunarr2)[3]表示数组指针,而void(* )( )表示函数指针,两者结合起来就是指向函数指针数组的指针。

发表评论

表情:
评论列表 (有 0 条评论,451人围观)

还没有评论,来说两句吧...

相关阅读