[C]函數指標&函數指針陣列

更新於 發佈於 閱讀時間約 1 分鐘



指向函數的指標

先分別定義三個函數:加、減、乘

void add(int * a, int b) 
{
*a += b;
}

void subtract(int* a, int b)
{
*a -= b;
}

void multiply(int * a, int b) {
*a *= b;
}

而函數名本身就是函數的地址(類似陣列)

所以你可以直接使用函數名來取得它的地址

而根據剛剛上面這些函數

返回形式為void,參數型態為(int * int )

這個函數指標的形式需要被宣告為void (*指針名稱)(int * , int)

    void (*func_ptr1)(int*, int) = add;   // 直接使用函數名
void (*func_ptr2)(int*, int) = &add; // 使用取址符號 &

操作也是類似其他指向變數的指針

而接下來也可以利用指針來操作函數:


func_ptr1(&a, b); // 使用 func_ptr1 調用 add 函數
func_ptr2(&a, b); // 使用 func_ptr2 調用 add 函數

函數指標作為參數

既然可以被視為地址

函數本身也可以做為其他函數的參數

下面先分別宣告addsubtract以及multiply

以及一個comput函數

void add(int * a, int b) 
{
*a += b;
}

void subtract(int* a, int b)
{
*a -= b;
}

void multiply(int * a, int b) {
*a *= b;
}

void comput(int* x, int y, void (*op)(int*, int))
{
op(x, y);
}

其中comput第三個參數的輸入形式為 void (* op)(int *, int)

也就是一個函數指針,指向返回void,輸入為(int*, int)的函數

addsubtract以及multiply 皆符合

因此調用時可以如此使用:

int main() 
{
int a = 10;
int b= 5;

comput(&a, b, multiply );
/*調用comput時直接輸入函數名稱multiply , 函數名稱本身就是地址 */

printf("a * b = %d\\n", a);
exit(0);
}

/*輸出:

a * b = 50

*/

函數指標陣列

當然我們也可以宣告一個指標陣列operations

陣列上的每個元素皆指向剛剛宣告的addsubtract以及multiply函數

當然返回形式與參數形式都要是固定的

void (*指標陣列名稱[元素個素])(int * , int)

void (*operations[3])(int*, int) = { add, subtract, multiply };

調用時也可使用陣列的用法

int main() 
{
void (*operations[3])(int*, int) = { add, subtract, multiply };

int a = 17;
int b= 4;

operations[0](&a, b); /*如使用陣列的方式訪問元素並執行add*/

printf("a + b = %d\\n", a);
exit(0);
}

/*
輸出
a + b = 21
*/

而函數指標陣列本身亦可作為函數的參數

在宣告一個comput2 :

void comput2(int* x, int y, void(*op[3])(int *, int) , int n)
{
op[n](x, y);
}

如同二維陣列作為參數一般

也需要將元素個數先定義

使用時comput2 也十分直觀:

int main() 
{
void (*operations[3])(int*, int) = { add, subtract, multiply };

int a = 17;
int b = 4;

comput2(&a, b, operations, 1); /*執行operations[1] ,即subtract*/

printf("a - b = %d\\n", a);
exit(0);
}
/*
輸出
a - b = 13
*/

留言
avatar-img
留言分享你的想法!
avatar-img
typedef struct 隨筆記{
1會員
6內容數
如果是失業的時候寫的 -那就是隨筆 如果是工作的時候寫的 -那就是筆記 但我狀態切換的很頻繁 那目前這坨東西就定義成「隨筆記」好了
2024/09/12
簡單紀錄二維陣列的配置方式及取址差異
Thumbnail
2024/09/12
簡單紀錄二維陣列的配置方式及取址差異
Thumbnail
2024/09/10
找工作面試常常問這個 就簡單紀錄一下
Thumbnail
2024/09/10
找工作面試常常問這個 就簡單紀錄一下
Thumbnail
2024/07/22
就簡單介紹一下static
Thumbnail
2024/07/22
就簡單介紹一下static
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—指數律基本練習
Thumbnail
高中數學主題練習—指數律基本練習
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
高中數學主題練習—標準化計算
Thumbnail
高中數學主題練習—標準化計算
Thumbnail
高中數學主題練習—相關係數計算
Thumbnail
高中數學主題練習—相關係數計算
Thumbnail
專案分享-計算機 邏輯思維:首先,要建立幾個變數與函式,方便我們作業。接下來針對每一個函式進行解釋。 讓大家可以自己動手做一個簡易的計算機
Thumbnail
專案分享-計算機 邏輯思維:首先,要建立幾個變數與函式,方便我們作業。接下來針對每一個函式進行解釋。 讓大家可以自己動手做一個簡易的計算機
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News