🚵我们知道,数组名就是数组的首元素的地址,这样数组和指针就有了联系
那么,函数名也可以得到地址吗?
答案是:可以的,函数名得到的是函数的地址。
下面这俩种方式均可以取出函数的地址
①&函数名
②函数名
🚵书写格式
数组指针的书写格式是这样的
int arr[5]={0};
int (*p)[5]=&arr;
函数指针和数组指针类似;
int (*pf)(int,int)=&Add;
int ret=(*pf)(2,3);
或int ret=pf(2,3);
注意:有 * 就一定要有( )
🚵来看一个函数指针的简单代码,
- #include <stdio.h>
-
- int Add(int x, int y)
- {
- return x + y;
- }
-
- void calc(int (*pf)(int, int))
- {
- int x = 0;
- int y = 0;
- scanf("%d %d", &x, &y);
- int ret = (*pf)(x, y);
-
- printf("%d\n", ret);
- }
-
- int main()
- {
- calc(Add);
-
- return 0;
- }
具体剖析一下
int (*arr[4])(int,int)={Add,Sub,Mul,Div};
int (*parr1[10])( );
用法尽在转移表中
举例:写个计算器
这里介绍三种写法:普通方法、函数指针方法、函数指针数组方法
①普通的写法:
👇👇
- #include <stdio.h>
-
- void menu()
- {
- printf("***************************\n");
- printf("***************************\n");
- printf("****** 0.leave ******\n");
- printf("****** 1.Add ******\n");
- printf("****** 2.Sub ******\n");
- printf("****** 3.Mul ******\n");
- printf("****** 4.Div ******\n");
- printf("***************************\n");
- printf("***************************\n");
- }
- int Add(int x, int y)
- {
- return x + y;
- }
- int Sub(int x, int y)
- {
- return x - y;
- }
- int Mul(int x, int y)
- {
- return x * y;
- }
- int Div(int x, int y)
- {
- return x / y;
- }
-
- int main()
- {
- int input = 0;
- int a = 0;
- int b = 0;
- int c = 0;
-
- do
- {
- menu();
- printf("请选择:");
- scanf("%d", &input);
- switch (input)
- {
- case 0:
- printf("退出\n");
- break;
- case 1:
- printf("请输入俩个操作数:");
- scanf("%d %d", &a, &b);
- c = Add(a, b);
- printf("%d\n", c);
- break;
- case 2:
- printf("请输入俩个操作数:");
- scanf("%d %d", &a, &b);
- c = Sub(a, b);
- printf("%d\n", c);
- break;
- case 3:
- printf("请输入俩个操作数:");
- scanf("%d %d", &a, &b);
- c = Mul(a, b);
- printf("%d\n", c);
- break;
- case 4:
- printf("请输入俩个操作数:");
- scanf("%d %d", &a, &b);
- c = Div(a, b);
- printf("%d\n", c);
- break;
- default:
- printf("输入错误,重新输入\n");
- }
-
- } while (input);
-
- return 0;
- }
②用函数指针的写法:
👇👇
- #include <stdio.h>
-
- void menu()
- {
- printf("***************************\n");
- printf("***************************\n");
- printf("****** 0.leave ******\n");
- printf("****** 1.Add ******\n");
- printf("****** 2.Sub ******\n");
- printf("****** 3.Mul ******\n");
- printf("****** 4.Div ******\n");
- printf("***************************\n");
- printf("***************************\n");
- }
- int Add(int x, int y)
- {
- return x + y;
- }
- int Sub(int x, int y)
- {
- return x - y;
- }
- int Mul(int x, int y)
- {
- return x * y;
- }
- int Div(int x, int y)
- {
- return x / y;
- }
- void calc(int (*pf)(int, int))
- {
- int a = 0;
- int b = 0;
- int c = 0;
- printf("请输入俩个操作数:");
- scanf("%d %d", &a, &b);
-
- c = (*pf)(a, b);
- //c=pf(a,b);这种格式也可以
- printf("%d\n", c);
- }
- int main()
- {
- int input = 0;
-
- do
- {
- menu();
- printf("请选择:");
- scanf("%d", &input);
- switch (input)
- {
- case 0:
- printf("退出\n");
- break;
- case 1:
- calc(Add);
- break;
- case 2:
- calc(Sub);
- break;
- case 3:
- calc(Mul);
- break;
- case 4:
- calc(Div);
- break;
- default:
- printf("输入错误,重新输入\n");
- }
-
- } while (input);
-
- return 0;
- }
🚵在这里我们来比较普通写法和函数指针写法:
🚵 通过上图,就可以发现普通写法实属冗余,函数指针的方法简化了很多。
但是函数指针需要写一个函数来接收函数的地址,如下:
③用函数指针数组的写法,又称转移表
👇👇
- #include <stdio.h>
-
- void menu()
- {
- printf("***************************\n");
- printf("***************************\n");
- printf("****** 0.leave ******\n");
- printf("****** 1.Add ******\n");
- printf("****** 2.Sub ******\n");
- printf("****** 3.Mul ******\n");
- printf("****** 4.Div ******\n");
- printf("***************************\n");
- printf("***************************\n");
- }
- int Add(int x, int y)
- {
- return x + y;
- }
- int Sub(int x, int y)
- {
- return x - y;
- }
- int Mul(int x, int y)
- {
- return x * y;
- }
- int Div(int x, int y)
- {
- return x / y;
- }
-
- int main()
- {
- int input = 0;
- int a = 0;
- int b = 0;
- int c = 0;
-
- do
- {
- menu();
- printf("请选择:");
- scanf("%d", &input);
- if (input == 0)
- printf("退出\n");
- else if (input >= 1 && input <= 4)
- {
- int (*p[5])(int x, int y) = { 0,Add,Sub,Mul,Div };
- printf("请输入俩个操作数:");
- scanf("%d %d", &a, &b);
- c = p[input](a, b);
- //c = (*p[input])(a, b);这种格式也可以
- printf("%d\n", c);
- }
- else
- printf("输入错误,重新输入\n");
-
- } while (input);
-
- return 0;
- }
🚵这里我们来比较一下函数指针和函数指针数组:
这俩种方法并没有优劣,只是提供了不同的做题角度
具体剖析函数指针数组:
将Add、Sub、Mul、Div 函数的地址存放在函数指针数组里,用户输入input,再通过(*p[input])找到正确的函数地址
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹