C語言—理解函式指標以及它的用法
阿新 • • 發佈:2019-01-10
什麼是函式指標?
指標前面已經寫過好多,自以為認識的差不多了,但是今天突然看到一個問題,寫一個函式指針,函式指標就是一個指向函式首地 址的指標,接下來寫幾個指標: 寫一個函式指標 寫一個函式指標陣列 寫一個指向函式指標陣列的指標 看到這三個是不是覺得挺繞~==》定義函式指標
舉個例子看以下程式碼:#include<stdio.h> #include<Windows.h> void fun() { printf("我呼叫成功了\n"); } int main() { void(*pfun)() = &fun; (*pfun)(); system("pause"); return 0; }
執行結果是什麼呢?
這個就是一個函式指標的宣告。
==》如何定義一個函式指標陣列?
以前我寫過一個部落格介紹陣列指標和指標陣列的區別,我們應該知道函式指標陣列,是每一個元素為函式指組的陣列,對它是數 組。 現在來看看他的用法:#include<stdio.h>
#include<Windows.h>
void fun1()
{
printf("我呼叫成功了\n");
}
void fun2()
{
printf("我第二次呼叫成功了\n");
}
void fun3()
{
printf("我第三次呼叫成功了\n");
}
int main()
{
void(*pfun)() = &fun1;
void(*pfun2)() = &fun2;
void(*pfun3)() = &fun3;
//接下來就是定義一個數組把他們三個裝進去。
void(*pfunarr[3])();
//在這裡呢看著個指標陣列,他就是一個具有3個以函式指標為內容的元素的函式指標陣列。
pfunarr[0] = &pfun;
pfunarr[1] = &pfun2;
pfunarr[2] = &pfun3;
pfunarr[0]();
pfunarr[1]();
pfunarr[2]();
system("pause");
return 0;
}
那我們一起來看看執行結果
很多人疑惑那個宣告是怎麼寫出來的,如果你定義一個整形陣列呢? int arr[3]。那麼我們剛剛知道函式指標型別 怎麼寫? void (*pfun)() 這個函式指標型別想把它變成陣列就去找那個名字往它後面加一個[3] 就ok了~ 也就是 void(*pfun[3])();
==》定義一個指向 指標陣列的指標
上面我們已經發現規律,那我再看如下程式碼~
#include<stdio.h>
#include<Windows.h>
void fun1()
{
printf("我呼叫成功了\n");
}
void fun2()
{
printf("我第二次呼叫成功了\n");
}
void fun3()
{
printf("我第三次呼叫成功了\n");
}
int main()
{
//void(*pfun)() = &fun1;
//void(*pfun2)() = &fun2;
//void(*pfun3)() = &fun3;
//接下來就是定義一個數組把他們三個裝進去。
void(*pfunarr[3])();
void(*(*pfunarr2)[3])();
//在這裡呢看著個指標陣列,他就是一個具有3個以函式指標為內容的元素的函式指標陣列。
pfunarr[0] = &fun1;
pfunarr[1] = &fun2;
pfunarr[2] = &fun3;
pfunarr2 = &pfunarr;
(*pfunarr2)[0]();
pfunarr[0]();
system("pause");
return 0;
}
再看看結果~
我們把那個宣告拿下來 分析一下 void (*(*pfunarr2)[3])(); 首先呢,把 (*pfunarr2)[3] 這一段程式碼先去掉。 (*pfunarr2)[3] 這段程式碼很明顯就是一個指標陣列的原型。 那麼它剩下來的部分是 void (*)() 這個是一個指向函式的指標原型。所以他兩個拼在一起 void (*(*pfunarr2)[3])(); 就叫做指向函式指標陣列的指標。 這裡這些聽起來特別繞,但是呢你自己理解了,它們拿出來其實就都挺簡單的嘍。