[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
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
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
高中數學主題練習—指數律基本練習
Thumbnail
高中數學主題練習—指數律基本練習
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
高中數學主題練習—標準化計算
Thumbnail
高中數學主題練習—標準化計算
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—向量分點公式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News