C进阶:指针(1)(下)

简介: C进阶:指针(1)(下)

五.函数指针

是指针,指向的是一个函数

所以说首先得是指针,然后才指向的是函数

具体如下图:

使用方法:

我们来看下面一段代码:

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. }

如果我们不使用函数指针数组,想要实现建议计算器的程序,就要用到很多重复的代码,如果想要给计算器添加更多的计算功能,那势必又要写上许多重复的代码,是我们的程序变得杂乱,可读性不高。

       😼😸本篇文章就到这里啦,如有错误或是建议,欢迎小伙伴们指出。😽😻

        🦖🐋谢谢你的阅读🦄🐰  

目录
相关文章
|
19天前
|
存储
指针进阶详解(下)
指针进阶详解(下)
23 0
|
6天前
|
C语言
C语言进阶:进阶指针(下)
C语言进阶:进阶指针(下)
|
6天前
|
C语言
C语言进阶:指针的进阶(上)
C语言进阶:指针的进阶(上)
|
7天前
入门后指针进阶习题深度分析
入门后指针进阶习题深度分析
17 1
|
7天前
进阶指针笔试题
进阶指针笔试题
16 0
|
12天前
|
存储 C语言 C++
C语言进阶——指针
C语言进阶——指针
|
14天前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(下)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
6 0
|
14天前
|
安全 C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(中)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
24 0