1,明確相關概念程序員
a,指針函數:一個函數,只是返回值是一個指針,eg: int *add(int a ,int b)函數
b,函數名就是整個函數裏面代碼的首地址指針
int add(int a,int b)內存
{io
printf("%d\n",a);變量
print("%d\n",b);數據類型
return a + b;語法
}程序
add 函數名就是整個函數add的首地址,就是三條語句的首地址,等於printf("%d\n",a);的首地址方法
2,函數指針概念:本質是一種程序員本身定義的數據類型(跟int,結構體數據類型同樣),它保存着一個函數的地址
3,函數指針數據類型聲明的語法:(不會分配內存,大型程序寫於頭文件)
語法: 返回值數據類型(*函數指針名)(形參表)
eg:int (*pfunc)(int a,int b);//pfunc就是一種數據類型,當成int類型來用
or eg:typedef int (*pfunc_t)(int a,int b);//對函數指針取別名pfunc_t(建議方法)
4,函數指針變量定義語法格式:函數指針名 函數指針變量;
eg:pfunc_t pfunc;//pfunc就是一個函數指針變量,未來保存函數地址
5,函數指針變量初始化
pfunc_t pfunc = add;//定義、初始化函數指針變量,指向add
6,經過函數指針變量來訪問指向的函數,經過函數指針變量調用指向的函數
語法:函數指針變量名(實參表);
//實例:
#includ<stdio.h>
typedef (*pfunc_t)(int a,int b);
int add(int a,int b)//定義加法函數
{
return a + b;
}
int sub(int a,int b)//定義減法函數
{
return a -b;
}
void main(void)
{
int ret = 0;
pfunc_t pfunc = NULL;//定義函數指針變量且初始化爲空
pfunc = add;//把add函數的地址保存於函數指針變量pfunc
ret = pfunc(100,200);調用add函數
printf("a + b = %d\n",ret);
func = sub;///把sub函數的地址保存於函數指針變量pfunc
ret = pfunc(100,200);//調用sub函數
printf("a + b = %d\n",ret);
}