1. 程式人生 > >C語言—理解函式指標以及它的用法

C語言—理解函式指標以及它的用法

什麼是函式指標?

指標前面已經寫過好多,自以為認識的差不多了,但是今天突然看到一個問題,寫一個函式指針,函式指標就是一個指向函式首地 址的指標,接下來寫幾個指標: 寫一個函式指標 寫一個函式指標陣列 寫一個指向函式指標陣列的指標 看到這三個是不是覺得挺繞~

==》定義函式指標

舉個例子看以下程式碼:
#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])(); 就叫做指向函式指標陣列的指標。 這裡這些聽起來特別繞,但是呢你自己理解了,它們拿出來其實就都挺簡單的嘍。