【C++】淺談函數指針

前言

隨着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來執行的,即輸出f1(t)=t+1f_1(t)=t+1

函數參數

從上一節可以看出,函數是可以作爲參數的,函數指針&&函數指針參數定義方式如下:

返回類型(*函數參數名)(類型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

參考文獻

怎樣定義函數指針數組

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