函数指针做函数参数浅析

来源:互联网 发布:ipad pro 键盘 知乎 编辑:程序博客网 时间:2024/06/17 18:17

先看看基本语法:

数组指针 语法

//定义一个int 类型的数组变量 int array[10]; //a代表的是数组首元素的地址  &a代表整个数组的地址  a+1 4  &a+1步长 40 .//定义 一个数组 类型 typedef int (my_type_array)[10];  my_type_array my_array;(my_array)[0] = 20; printf("%d\n", my_array[0]); //定义一个指针数组类型 typedef int (*pt_type_array)[10];  pt_type_array p_array;  //用这种类型定义变量p_array = &array;(*p_array)[1] = 10;  printf("%d\n", array[1]); //定义一个 指向数组类型的指针  int (*p_ele_array)[10];  //分配内存p_ele_array = &array;(*p_ele_array)[0] = 30;printf("%d\n", array[0]); 

函数指针 语法:

int sum(int a, int b){printf("this is a sum function:%d+%d=%d\n",a,b,a+ b);return a+ b;}int main(){sum(10,20);  //直接调用//定义一个函数类型 typedef int (my_type_func)(int a, int b); my_type_func *my_ = NULL;  //定义了一个指针, 指向某种类型的函数.. //my_ = ∑ 有没有&都可以 my_ = sum;my_(10,10); //定义一个函数指针类型 typedef int (*p_type_func)(int a, int b);p_type_func my_p ;  //定义一个指针变量 //my_p = ∑my_p = sum;my_p(10,30);return 0;}


由上可知,这种写法确实麻烦了许多,相比直接调用

但是和带来的好处相比,这点麻烦却是微不足道的

 

//底层函数实现 int sum_01(int a, int b){printf("this is a sum_01 function:%d+%d=%d\n",a,b,a+ b);return a+ b;}int sum_02(int a, int b){printf("this is a sum_01 function:2*%d+2*%d=%d\n",a,b,2*a+ 2*b);return 2*a+ 2*b;}int sum_03(int a, int b){printf("this is a sum_01 function:3*%d+3*%d=%d\n",a,b,3*a+ 3*b);return 3*a+ 3*b;}typedef int (*p_type_func)(int a, int b);  //定义一个函数指针类型  接口函数声明 void select(p_type_func p_func, int a, int b) //主调函数 {p_func(a,b);}int main(){//只要符合接口声明的函数统统可以调用select(sum_01, 10,10);  select(sum_02, 10,10);select(sum_03, 10,10);return 0;}

typedef int (*p_type_func)(int a, int b); 
这句话有什么作用 :

提前将函数返回值和函数参数做了约定,这样只要符合这个约定的函数都可以被调用,例如说 某个程序中有个按钮 ,

有的按钮是确认功能,有的是取消,是不是每种类型都有与之对应的一种按钮呢,

当然不是,那还有跳转页面的,翻页的,后退的,,,简直可以累死了,

怎么做呢

当然是只做一个按钮咯,然后功能随你添加,怎么添加功能提前约定好,只要按这种方式,就可以随意添加功能了

如果用面对对象的方法来说,就是有一个button对象,需要重写其action方法

当然我还是喜欢Qt的槽函数机制;

说到底就是回调函数, 一个函数调用另一个函数(很大可能不是他写的),然后返回到当前函数,像线程启动函数,等等 ,

这不就很像一个槽么,大概想到的就这些了,

还有最重要的一点 任务的编写者和任务的执行者分离了,   a写函数实现,  b调用a的函数,c也可以调用,大家都有事情干嘛是不是

不足之处,请指出




0 0
原创粉丝点击