函数指针做函数参数浅析

先看看基本语法:

数组指针 语法

	//定义一个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也可以调用,大家都有事情干嘛是不是

不足之处,请指出




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章