前言
隨着C語言的深入學習,我開始考慮一些深層次功能的實現:變長參數、函數作參、函數數組……
WARNING:
這些都是C語言書上很少提及的部分,但是他們卻很有用,你甚至可以在STL中看到(sort函數)這些深層思想的算法,今天我們就談論一下函數作參(函數作爲參數)和函數數組吧(以數組的形式保存函數)。
什麼是函數指針
在這之前,需要首先知道什麼是函數指針。函數指針的定義形象點來說,就是用一個指針變量代替原函數中的函數名位置。
這裏我發現了一個有趣的事,函數定義在相鄰的位置,他們的函數指針地址是相近的。
#include <stdio.h>
int f1(int n){return n+1;}
int main(){
printf("f1函數地址:%d\n",&f1);
return 0;
}
我們得到了如下所示的函數地址:
- f1函數地址:4199248
可以發現每個函數都有一個地址,那麼我們能不能像指針一樣用*
符調用呢?
#include <stdio.h>
#define t 1
int f1(int n){return n+1;}
void show(int (*f)(int)){
printf("%d\n",f(t));
}
int main(){
show(f1);
return 0;
}
輸出爲:2
這說明show把f1作爲參數是成功調用了函數f1來執行的,即輸出。
函數參數
從上一節可以看出,函數是可以作爲參數的,函數指針&&函數指針參數定義方式如下:
返回類型(*函數參數名)(類型1 函數參數1,類型2 函數參數2……)
函數參數名可以省略,比如:
int (*f)(int)
等價於:
int (*f)(int n)
函數數組
函數數組就是用指針保存函數,定義方式也與普通數組有所區別。
若有如下4個函數:
int f1(int n){return n+1;}
int f2(int n){return n+2;}
int f3(int n){return n+3;}
int f4(int n){return n+4;}
那麼函數數組定義爲:
int (*f[4])(int)={f1,f2,f3,f4};
他的調用形式爲:
f[i](n)
測試代碼:
#include <stdio.h>
#define t 2
int f1(int n){return n+1;}
int f2(int n){return n+2;}
int f3(int n){return n+3;}
int f4(int n){return n+4;}
int (*f[4])(int)={f1,f2,f3,f4};
int main(){
for(int i=0;i<4;i++)
printf("函數指針數組f[%d](%d) = %d\n",i,t,f[i](t));
return 0;
}
輸出:
函數指針數組f[0](2) = 3
函數指針數組f[1](2) = 4
函數指針數組f[2](2) = 5
函數指針數組f[3](2) = 6