wordpress文章顯示小時(shí)分鐘天津seo推廣服務(wù)
(一)前文回顧
1、前篇代碼分析
void(*signal(int , void(*)(int)))(int) ;
那么這串代碼究竟是什么呢?
別慌,讓我們來(lái)一步一步拆解,首先我們通過(guò)之前的學(xué)習(xí),已經(jīng)明白了什么是函數(shù)指針(如果有不太懂得,請(qǐng)看前一篇文章)
仔細(xì)觀察這串代碼,不難發(fā)現(xiàn)出現(xiàn)了 signal 此時(shí)肯定會(huì)有人想是不是有什么特殊的含義。。。
很明顯,signal就是簡(jiǎn)簡(jiǎn)單單的一個(gè)函數(shù)名,不行,來(lái)我們輕輕的把這串代碼“大卸八塊”。
(1)去掉最外層的 void()(int) 剩余?*signal(int , void(*)(int))?;? 現(xiàn)在signal只有兩種可能?!?,就是指針? ? ? 2,是函數(shù)名】
? ? ? ? ?我們之前的學(xué)習(xí)中已經(jīng)知道當(dāng) * 和()同時(shí)存在的時(shí)候,()首先于變量名結(jié)合,所以此處的? signal(int , void(*)(int)) 首先是一部分,也就是個(gè)函數(shù)。
(2)再來(lái)看 signal(int , void(*)(int)) 的()內(nèi)的部分,我們發(fā)現(xiàn)有個(gè) int,這說(shuō)明函數(shù)內(nèi)有個(gè)參數(shù)是 int 類型,那么剩余的參數(shù)?void(*)(int) 是什么類型呢?
? ? ? ? ?學(xué)過(guò)函數(shù)指針的朋友不難看出,這就是一個(gè)函數(shù)指針類型的參數(shù)。
(3)再想想,* 是什么呢 ?此時(shí)發(fā)現(xiàn)不好解釋啊,但是你把剛開(kāi)始去掉的外層結(jié)構(gòu)加上再看就會(huì)一目了然!
? ? ? ? ?void(*? ? ? ? )(int)? ?//這也是個(gè)函數(shù)指針類型,再結(jié)合中間部分是個(gè)函數(shù),我們就能明白整個(gè)代碼?void(*signal(int , void(*)(int)))(int) ; 的意思是? 函數(shù)指針類型的函數(shù)
(二)函數(shù)指針數(shù)組
1、基本知識(shí)
(1)本質(zhì):
函數(shù)指針數(shù)組,顧名思義就是存放函數(shù)指針的一個(gè)數(shù)組!!!
(2)示例
int add(int x , int y)? //定義一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)的相加
{
? ? ? return x+y;
}int sub(int x , int y)? //定義一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)的相減
{
? ? ? return x+y;
}int main()
{
? ? ? int(*pf)( int ,int ) = add ; //定義一個(gè)函數(shù)指針指向 add 函數(shù)? ? ??int(*pf1)( int ,int ) = sub?;??//定義一個(gè)函數(shù)指針指向 sub?函數(shù)
? ? ??int( *parr[2] )( int ,int ) = {pf,pf1?};? //此時(shí)的parr就是一個(gè)數(shù)組,類型為函數(shù)指針,存放了兩個(gè)函數(shù)指針
}
根據(jù)上述代碼,我們就能知道函數(shù)指針數(shù)組究竟是什么樣的了,需要注意的是 函數(shù)指針數(shù)組和普通數(shù)組大致相同,存放的元素類型要相同,所以存放的函數(shù)指針的類型也要相同!!
2、練習(xí)——計(jì)算器——避免使用switch()
(1)基本思路
1. 首先簡(jiǎn)單的計(jì)算器我們需要 四個(gè)函數(shù) 來(lái)分別實(shí)現(xiàn) 加減乘除?四個(gè)功能 ;
2.需要一個(gè)菜單來(lái)提醒用戶;
3.在主函數(shù)中需要循環(huán),并且由于不使用 switch(),所以應(yīng)用本節(jié)學(xué)習(xí),使用函數(shù)指針數(shù)組。
(2)代碼如下:
#include<stdio.h>
int Add(int x, int y) //定義四個(gè)函數(shù)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}
void menu() //菜單
{printf("***0.加法*******\n");printf("***1.減法*******\n");printf("***2.乘法*******\n");printf("***3.除法*******\n");printf("***4.退出*******\n");
}
int main()
{int(*pf[5])(int, int) = { Add, Sub ,Mul,Div,NULL };//定義一個(gè)函數(shù)指針數(shù)組,數(shù)組第1,2//3,4個(gè)元素分別對(duì)應(yīng)四個(gè)函數(shù),可以使用下標(biāo)來(lái)取出,最后一個(gè)元素是個(gè)空指針,來(lái)退出程序int a = 0; //定義一個(gè)局部變量來(lái)讓用戶選擇具體算法int b, c = 0;do {//使用do while()循環(huán)可以不判斷先執(zhí)行一次menu();printf("請(qǐng)選擇\n");scanf_s("%d", &a);if (a >= 0 && a <= 3)//下標(biāo)在0~3即對(duì)應(yīng)四個(gè)函數(shù){printf("請(qǐng)輸入兩個(gè)數(shù)\n");scanf_s("%d %d", &b, &c);int ret = pf[a](b, c); //調(diào)用printf("%d\n", ret);}else if (a == 4)//下標(biāo)為4就對(duì)應(yīng)空指針{printf("退出\n");break;}else{printf("選擇錯(cuò)誤\n");//選擇其余顯示錯(cuò)誤break;}} while (a);return 0;
}
執(zhí)行如下:?