C語言進(jìn)階:指針的進(jìn)階(4)
函數(shù)指針
函數(shù)指針的定義
整型指針存放整型的地址;數(shù)組指針存放數(shù)組的地址;那么類比可得,函數(shù)指針存放函數(shù)的地址。
顯然,函數(shù)指針指向函數(shù),存放函數(shù)的地址。搞懂函數(shù)指針,先了解函數(shù)的地址。

&函數(shù)名或函數(shù)名代表函數(shù)地址,與&數(shù)組名和數(shù)組名略有不同,&函數(shù)名和函數(shù)名完全一致。
函數(shù)的地址必然要放到函數(shù)指針里,函數(shù)指針的類型該如何寫呢?(以Add函數(shù)為例)
//整型指針 int* pa = &a; //字符指針 char* pc = &ch; //數(shù)組指針 int(*pa)[10] = &arr; //函數(shù)指針 - 存放函數(shù)地址 int(*pf)(int, int) = &Add;
函數(shù)指針的類型
int Add(int x, int y); //1. int(*pf)(int, int) = &Add; //2. int *pf(int, int) = &Add;
倘若,去掉括號
int* pf(int, int),pf就變成函數(shù)名,返回類型是int*。所以指針必須帶括號。
前文已交代,指針,去掉指針名和*就是指針?biāo)赶虻淖兞款愋汀?/p>
- 整型指針,去掉*和指針名,即為整型變量類型int。字符指針,為字符類型char。數(shù)組指針,去掉后為數(shù)組類型int[10]。
- 函數(shù)指針,去掉*和指針名,即為函數(shù)的類型int(int,int)。
總結(jié)
- 去掉指針名pf,即為指針類型
int(*)(int, int) - 去掉指針名pf和*,即為指針?biāo)赶虻暮瘮?shù)類型為
int(int, int)
函數(shù)指針的使用
計(jì)算機(jī)硬件程序經(jīng)常通過調(diào)用地址的方式來調(diào)用函數(shù),因此需要使用函數(shù)指針調(diào)用函數(shù)。
int Add(int x, int y)
{
return x + y;
}
int main()
{
//1.
int(*pf)(int, int) = &Add;//函數(shù)指針指向Add函數(shù)
//2.
int(*pf)(int, int) = Add;
//1.
int ret = (*pf)(2, 3);
//2.
int ret = pf(2, 3);
printf("%d\n", ret);
return 0;
}
前面已經(jīng)交代,&函數(shù)名和函數(shù)名都是函數(shù)的地址,完全等價(jià)。所以兩種初始化函數(shù)指針的方式都可以。
既然函數(shù)名Add可以直接賦值給函數(shù)指針pf,說明二者等價(jià)。函數(shù)指針名pf不解引用也可以使用,*在此處形同虛設(shè),甚至于不寫或?qū)懚鄠€(gè)都并無大礙,僅為理解。
既然函數(shù)名也是函數(shù)地址,所以對其解引用也是可以的。我們甚至可以這樣寫,但僅限娛樂,沒有必要。
Add(2, 3);//1 (*Add)(2, 3);//2 (*&Add)(2, 3);//3
Example
解釋下列代碼
//1. (*(void(*)())0)(); //2. void (*signal(int, void(*)(int)))(int);

1.void(*)()是函數(shù)指針類型,放在( )0中,也就是把0強(qiáng)制轉(zhuǎn)換成地址,該地址處存放一個(gè)函數(shù)其類型為void(*)(void)。
2.這樣(void(*)())0就變成了指針,指向該地址的函數(shù),且對其解引用訪問此函數(shù)。
3.(*(void(*)())0)也相當(dāng)于(*pf),通過函數(shù)指針解引用代替函數(shù)名,函數(shù)名后面帶上();,相當(dāng)于(*pf)();也就是一次不傳參的函數(shù)調(diào)用。

1.signal先和()結(jié)合,說明signal為函數(shù)名,其后(int, void(*)(int)),為其參數(shù)列表。
2.去掉函數(shù)名稱和參數(shù)列表,剩下的void(*)(int)就是返回類型,所以是一次函數(shù)聲明。
void (* signal(int, void(*)(int)) ) (int); typedef void(* pf_t)(int);//typedef簡化代碼 pf_t signal(int, pf_t);
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++實(shí)現(xiàn)旅館住宿管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)旅館住宿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
VisualStudio2019構(gòu)建C/C++靜態(tài)庫和動態(tài)庫dll的問題 附源碼
這篇文章主要介紹了VisualStudio2019構(gòu)建C/C++靜態(tài)庫和動態(tài)庫(dll)(文末附源碼),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
C語言 結(jié)構(gòu)體(Struct)詳解及示例代碼
本文主要介紹C語言 結(jié)構(gòu)體的知識,學(xué)習(xí)C語言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下2016-08-08
詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員
這篇文章主要介紹了詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-01-01

