函數指針做函數參數淺析

先看看基本語法:

數組指針 語法

	//定義一個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也可以調用,大家都有事情幹嘛是不是

不足之處,請指出




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