先看看基本语法:
数组指针 语法
//定义一个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也可以调用,大家都有事情干嘛是不是
不足之处,请指出