C語(yǔ)言進(jìn)階:指針的進(jìn)階(5)
函數(shù)指針數(shù)組
//整型數(shù)組 - 存放整型變量 int arr[10]; //字符數(shù)組 - 存放字符變量 char ch[5]; //指針數(shù)組 - 存放指針變量 int* arr[10]; //函數(shù)指針數(shù)組 - 存放函數(shù)指針 int(*pfar[10])(int, int);
指針數(shù)組存放指針變量,函數(shù)指針數(shù)組存放函數(shù)指針,故元素類(lèi)型為函數(shù)指針類(lèi)型。
函數(shù)指針數(shù)組的定義
int Add(int x, int y) {//int(*)(int,int) return x + y; } int Sub(int x, int y) {//int(*)(int,int) return x - y; } int Mul(int x, int y) {//int(*)(int,int) return x * y; } int Div(int x, int y) {//int(*)(int,int) return x / y; } int main() { //函數(shù)指針數(shù)組 - pfArr int(*pfArr[4])(int, int) = { Add,Sub,Mul,Div }; return 0; }
類(lèi)型相同的函數(shù),存放在同一個(gè)函數(shù)指針數(shù)組中。一般功能相似的函數(shù),其類(lèi)型也相同。
函數(shù)指針數(shù)組的使用
利用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器,以簡(jiǎn)化調(diào)用過(guò)程。
轉(zhuǎn)移表
//計(jì)算器實(shí)現(xiàn)1.0 void menu() { printf("**********************************\n"); printf("***** 1.Add ****** 2.Sub *****\n"); printf("***** 3.Mul ****** 4.Div *****\n"); printf("************ 0.exit ************\n"); printf("**********************************\n"); } int main() { int (*pfArr[10]) (int, int) = { 0,Add,Sub,Mul,Div };//數(shù)組下標(biāo)和選項(xiàng)序號(hào)匹配 int input = 0; int a = 0; int b = 0; do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); if (0 <= input && input <= 4) { if (input == 0) { printf("退出游戲\n"); break; } else { printf("請(qǐng)輸入操作數(shù)\n"); scanf("%d %d", &a, &b); printf("ret == %d\n", pfArr[input](a, b)); break; } } else { printf("輸入錯(cuò)誤\n"); break; } } while (input); return 0; }
函數(shù)指針數(shù)組實(shí)現(xiàn)不同選擇情況下,通過(guò)函數(shù)地址“跳轉(zhuǎn)”到不同的函數(shù)的功能。
這樣的函數(shù)指針數(shù)組成為轉(zhuǎn)移表。(跳轉(zhuǎn)功能)
回調(diào)函數(shù)
若不想舍棄switch語(yǔ)句,還可以這樣簡(jiǎn)化代碼3.0,代價(jià)為創(chuàng)建全局變量。若不想創(chuàng)建全局變量,可以使用2.0
/****** * 計(jì)算器實(shí)現(xiàn) * 2.0 ******/ void Calc(int (*pf)(int,int)) { int a = 0; int b = 0; printf("請(qǐng)輸入操作數(shù):>"); scanf("%d %d", &a, &b); printf("%d\n", pf(a, b)); } int main() { int input = 0; do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); switch (input) { case 0: printf("退出成功\n"); break; case 1: Calc(Add); break; case 2: Calc(Sub); break; case 3: Calc(Mul); break; case 4: Calc(Div); break; default: printf("請(qǐng)重新選擇\n"); break; } } while (input); return 0; } /****** * 計(jì)算器實(shí)現(xiàn) * 3.0 ******/ int (*pfArr[10])(int, int) = { 0,Add,Sub,Mul,Div }; int input = 0; void Call() { int a = 0; int b = 0; printf("請(qǐng)輸入操作數(shù):>"); scanf("%d %d", &a, &b); printf("%d\n", pfArr[input](a, b)); } int main() { do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); switch (input) { case 0: printf("退出成功\n"); break; case 1: case 2: case 3: case 4: Call(); break; default: printf("請(qǐng)重新選擇\n"); break; } } while (input); return 0; }
如下圖所示,被通過(guò)函數(shù)指針調(diào)用的函數(shù)叫做回調(diào)函數(shù),回調(diào)函數(shù)即使第三方調(diào)用調(diào)用函數(shù)的參數(shù)也在其中被調(diào)用。
若想在調(diào)用函數(shù)中隨條件變化而調(diào)用不同的函數(shù),就必須使用回調(diào)函數(shù)的方法:調(diào)用函數(shù)中使用函數(shù)指針,指向不同函數(shù)?;卣{(diào)函數(shù)在大型工程中顯得非常方便。
指向函數(shù)指針數(shù)組的指針
int arr[10]; int(*parr)[10] = &arr;//整型數(shù)組指針 char(*pch)[10] = &ch;//字符數(shù)組指針 //指向整型數(shù)組指針的指針 int(*(*pparr))[10] = &parr; //指向字符數(shù)組指針的指針 char(*(*ppch))[10] = &pch; //函數(shù)1. int Add(int x, int y) { return x + y; } //函數(shù)指針2. int (*pf)(int, int) = Add; //函數(shù)指針數(shù)組3. int (*pfArr[10])(int, int) = { Add }; //指向函數(shù)指針數(shù)組的指針4. int(*(*ppfArr)[10])(int, int) = &pfArr;
前面已經(jīng)交代,指針去掉*號(hào)和指針名,就是指向的變量類(lèi)型;去掉指針名就是指針的類(lèi)型。
反過(guò)來(lái),定義數(shù)組指針,需要得到指針?biāo)赶虻臄?shù)組的類(lèi)型。1.先寫(xiě)出指針名,在其前面加*;2.寫(xiě)出數(shù)組的類(lèi)型int()[10]
定義指向函數(shù)指針數(shù)組的指針,依次寫(xiě)出如下內(nèi)容:
1.函數(shù) —— 得到函數(shù)類(lèi)型:int(int, int)
2.函數(shù)指針 —— 得到函數(shù)指針類(lèi)型:int(*)(int, int)
3.函數(shù)指針數(shù)組 —— 得到函數(shù)指針數(shù)組的類(lèi)型:int(*[10])(int, int)
4.指向函數(shù)指針數(shù)組的指針
從后往前看,指向函數(shù)指針數(shù)組的指針去掉*和指針名就是函數(shù)指針數(shù)組的類(lèi)型,函數(shù)指針數(shù)組去掉*和指針名就是函數(shù)指針類(lèi)型,函數(shù)指針去掉*和指針名就是函數(shù)類(lèi)型。
在研究下去就沒(méi)有必要了,指針?lè)旁跀?shù)組里,數(shù)組被指針?biāo)赶颉?/p>
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)魔方比賽管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)魔方比賽管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C++作用域與函數(shù)重載的實(shí)現(xiàn)
本文主要介紹了C++作用域與函數(shù)重載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02C++深度優(yōu)先搜索的實(shí)現(xiàn)方法
這篇文章主要介紹了C++深度優(yōu)先搜索的實(shí)現(xiàn)方法,是數(shù)據(jù)結(jié)構(gòu)中非常重要的一種算法,需要的朋友可以參考下2014-08-08C++ 中實(shí)現(xiàn)把EXCEL的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)(ACCESS、MSSQL等)實(shí)例代碼
這篇文章主要介紹了C++ 中實(shí)現(xiàn)把EXCEL的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)(ACCESS、MSSQL等)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04C語(yǔ)言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問(wèn)題解決
這篇文章主要介紹了C語(yǔ)言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問(wèn)題解決,文中的題目是將元素連接起來(lái)排成一個(gè)數(shù)并要求出這類(lèi)結(jié)果中數(shù)最小的一個(gè),需要的朋友可以參考下2016-03-03