指標函式與函式指標陣列 — Function Pointers, Array of Function Pointer

Sharon Peng
3 min readAug 28, 2019

--

前面我們知道指標可以指向任何的記憶體位址,這也代表指標可以指向任何一段可執行的程式碼,這也稱作為指標函式。

指標函式的宣告:(*代表指標的意思)

回傳的資料型態 (*函式名稱)(參數)

注意:括弧(*functionName)是很重要的部份,如果沒有括弧,編譯器會自動視為此函式回傳的只是一個指標而不是指標函式。

宣告指標函式之後,我們要賦予函式給指標函式(就像賦予指標一個記憶體位址)。

範例程式碼:

#include <stdio.h>void sayHi (int times); // 宣告函式int main ()
{
void ( *funcptr )(int); // function pointer
funcptr = sayHi; // pointer assignment (把函式賦予給指標函式)

funcptr(3); // 呼叫函式

return 0;
}
void sayHi ( int times )
{
for( int i; i < times; ++i )
{
printf( "Hi\n" );
}
}

函式指標的名稱就等同於記憶體位址的名稱,跟陣列的概念雷同。我們也可以寫成 funcptr = &sayHi,(*funcptr)(3)也跟上方程式碼相同,所以我們不用刻意去寫得那麼複雜,用函式名稱即可。

再來跟函式指標很像的是「在陣列中傳遞函式」,這次我們傳的不是函式是陣列。

當我們使用函式指標陣列(函式指標_陣列)時,我們可以省去寫if, switch的步驟,要怎麼使用呢,就由下方程式碼來舉例吧~

#include <stdio.h>int add(int num1, int num2);       //宣告加法函式
int subtract(int num1, int num2); //宣告減法函式
int multiply(int num1, int num2); //宣告乘法函式
int divide(int num1, int num2); //宣告除法函式
int main()
{
int x, y, choice, result;
int (*op[4])(int, int); //宣告陣列函式指標,回傳值為整數型態
op[0] = add; //將函式指標存入陣列函式指標中
op[1] = subtract; //將函式指標存入陣列函式指標中
op[2] = multiply; //將函式指標存入陣列函式指標中
op[3] = divide; //將函式指標存入陣列函式指標中
printf("輸入兩個整數: ");
scanf("%d%d", &x, &y);
printf("輸入0可以做加法,輸入1可以做減法,輸入2可以做乘法,輸入3可以做除法: ");
scanf("%d", &choice);
result = op[choice](x, y); // 把回傳值存入result中
printf("%d", result);

return 0;
}
int add(int x, int y) {
return(x + y);
}
int subtract(int x, int y) {
return(x - y);
}
int multiply(int x, int y) {
return(x * y);
}
int divide(int x, int y) {
if (y != 0)
return (x / y);
else
return 0;
}

這章比較複雜一點,需要時間消化一下。所以不講太多東西,到這邊就好了,謝謝大家的閱讀。

--

--