先看看基本語法:
數組指針 語法
//定義一個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也可以調用,大家都有事情幹嘛是不是
不足之處,請指出