五.函数指针
是指针,指向的是一个函数
所以说首先得是指针,然后才指向的是函数
具体如下图:
使用方法:
我们来看下面一段代码:
1. int Add(int x, int y) 2. { 3. return x + y; 4. } 5. int main() 6. { 7. printf("Add=%p\n", Add); 8. printf("&Add=%p\n", &Add); 9. return 0; 10. }
打印结果:
那么这就说明上方的 int (*pf)(int,int)=&Add; 可以写成 ---> int (*pf)(int,int)=Add;
其实这个 * 星号在这里也没什么用,他是为了帮助我们更好的理解,所以上方使用函数指针时还可以写成:int ret=pf(3,5) ; 不管是哪一种写法,最后的结果都是一样的
所以函数名就是函数的地址,即函数名=&函数名
六.两段有趣的代码
1. (* (void ( * )( )0 )();
解析:
2. void ( *singal ( int , void( * ) ( int ) ) ) ( int )
解析:
这样写未免太麻烦,我们可以利用关键字 typedef 来重定义 singal 的返回值类型
如图 :
七.函数指针数组
顾名思义,函数指针数组就是存储函数指针的数组,函数指针指向的函数必须是同一类型的,即函数的参数和返回值相同。
首先得是个数组,然后再存储函数指针。
如图:
函数指针的用途:转移表(出自《C和指针》这本书);
例如我们写一个简易的计算器代码:
1. void menu() 2. { 3. printf("********************************************************\n"); 4. printf("********* 1.Add 2.Sub **********\n"); 5. printf("********* 3.Mul 4.Div **********\n"); 6. printf("********* 0.exit **********\n"); 7. printf("********************************************************\n"); 8. 9. } 10. int Add(int x, int y) 11. { 12. return x + y; 13. } 14. int Sub(int x, int y) 15. { 16. return x - y; 17. } 18. int Mul(int x, int y) 19. { 20. return x * y; 21. } 22. int Div(int x, int y) 23. { 24. return x / y; 25. } 26. int main() 27. { 28. int input = 0; 29. int (*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div };//使下标所对应的函数与我们期望的一样 30. do 31. { 32. menu(); 33. printf("请选择:>"); 34. scanf("%d", &input); 35. int x = 0, y = 0, ret = 0; 36. if (input >= 1 && input <= 4) 37. { 38. printf("请输入两个操作数:>"); 39. scanf("%d %d", &x, &y); 40. ret = (parr[input])(x, y); 41. printf("ret=%d\n", ret); 42. } 43. else if (input == 0) 44. { 45. printf("exit\n"); 46. } 47. else 48. { 49. printf("选择错误,重新选择\n"); 50. } 51. } while (input); 52. 53. return 0; 54. }
如果我们不使用函数指针数组,想要实现建议计算器的程序,就要用到很多重复的代码,如果想要给计算器添加更多的计算功能,那势必又要写上许多重复的代码,是我们的程序变得杂乱,可读性不高。
😼😸本篇文章就到这里啦,如有错误或是建议,欢迎小伙伴们指出。😽😻