C語言中函數(shù)指針
函數(shù)調(diào)用的方法有兩種分別如下:
void Fun(void)
{
//do something
}
int main(void)
{
...
Fun();
...
return 0;
}
void Fun(void)
{
//do something
}
int main(void)
{
...
void (*p)(void);
p=Fun;
p();
return 0;
}
上面兩種方式都可以調(diào)用函數(shù),第二種方式在回調(diào)函數(shù)中用的最多,尤其是在操作系統(tǒng)的任務(wù)切換中。 那么我們就重點來分析下第二種方式。
第二種方式申明了一個函數(shù)指針p,那為啥寫成void(p)(void)? 為啥不直接寫成p,不是說了函數(shù)名就是該函數(shù)的入口地址,為啥不直接把該地址傳給指針呢,這樣既好理解又方便省事,其實這樣想不無道理,但是在C語言中有變量類型這個東東,比如int賦值給char,編譯器就會報錯,同樣的道理函數(shù)也有類型,那么既然函數(shù)有類型,我們?nèi)绾沃雷兞款愋湍亍?現(xiàn)在寫一個程序如下,注意,程序有錯誤,這個錯誤是故意寫的,目的就是讓編譯器報錯,使用編譯器為gcc。
#include "stdio.h"
void Fun(void)
{
printf("hello world");
}
int main(void)
{
void *p;
p=Fun;
return 0;
}
下面是編譯器輸出:
g++.exe -x c++ -c C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.c -o C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.o -Wall -fallowive -Wno-sign-compare -g
C:\\用戶\\管理員.SC-201903191934\\桌面\\未知1.c:在函數(shù)中 int main()':** **C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.c:12: warning: invalid conversion from
空 ( )()' 改為 '無效 '
編譯器報錯意思是不能講void ( )()類型轉(zhuǎn)化為void 類型。 這個警告就說明了函數(shù)Fun的類型是( )()類型,而申明的指針類型是 ,兩個類型不一致,故導(dǎo)致其錯誤,既然這樣,那么如何申請一個指針類型為( )()的呢? C語言中給了函數(shù)指針這個類型,即( )()類型,因此為了讓指針指向一個函數(shù)地址,只需要聲明一個(*)()類型即可。
如下:
#include "stdio.h"
void Fun(void)
{
printf("hello world");
}
int main(void)
{
void (*p)(void); //函數(shù)指針
p=Fun; return 0;
}
這樣就將函數(shù)Fun的地址給指針p了,與其說p是一個函數(shù)指針,倒不如說p是一個函數(shù)名,只是沒有什么其函數(shù)內(nèi)部,這里可以從舊式的函數(shù)申明上可以看出。
因此要運行這個所謂的函數(shù)p,只需要和函數(shù)使用一樣就行,p();
現(xiàn)在再來看一個代碼:
void *Fun(void)
{
printf("hello world");
return NULL;
}
這里函數(shù)Fun改為了有返回值的函數(shù),其返回值為指針void *類型,那么我們?nèi)绾蝸砺暶饕粋€指針指該函數(shù)呢?
從上門面分析可以看出,該函數(shù)的類型應(yīng)該是*(*)(); 所以現(xiàn)在我們需要聲明一個相同類型的指針,即void *(*p)(void); 這樣就只需要p=Fun; 就可以達(dá)到目的了。
#include "stdio.h"
void *Fun(void)
{
printf("hello world");
return NULL;
}
int main(void)
{
void *(*p)(void);
p=Fun;
return 0;
}
**總結(jié):
函數(shù)名也是有類型的,因此在C語言中,必須嚴(yán)格遵守類型匹配原則。
函數(shù)名的類型為(*)()類型,如果有返回值,則在最前面增加返回類型即可,例如
int * Fun(int,int ); 其函數(shù)類型為 ()(int,int),對應(yīng)的函數(shù)指針為int **(*p)(int,int);
-
C語言
+關(guān)注
關(guān)注
180文章
7624瀏覽量
139510 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4363瀏覽量
63710 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
70881 -
編譯器
+關(guān)注
關(guān)注
1文章
1651瀏覽量
49691 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
88瀏覽量
11778
發(fā)布評論請先 登錄
相關(guān)推薦
C語言中void指針的基本認(rèn)識及典型應(yīng)用
C語言中指針函數(shù)和函數(shù)指針的概念及應(yīng)用示例
c語言指針詳解
c語言函數(shù)指針定義,指針函數(shù)和函數(shù)指針的區(qū)別
C語言中的野指針是怎么來的?
C語言中什么是指針數(shù)組
簡述C語言中指針重點
c語言指針用法詳解:如何使用指針變量做函數(shù)參數(shù)

評論