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