標(biāo)題: C語(yǔ)言函數(shù)指針的探索 [打印本頁(yè)]
作者: xueer 時(shí)間: 2013-7-31 01:31
標(biāo)題: C語(yǔ)言函數(shù)指針的探索
一談到C語(yǔ)言,很多學(xué)過(guò)編程的同學(xué)會(huì)感覺(jué)比較容易。但是談到C語(yǔ)言的指針,大多數(shù)的同學(xué)就不這么認(rèn)為了,但是當(dāng)談到函數(shù)指針時(shí),很多在校的同學(xué)更是望而卻步。今天就來(lái)探索一下函數(shù)指針的使用:
用過(guò)Visual studio的同學(xué)一定會(huì)對(duì)微軟的自動(dòng)提示功能大為驚嘆,編寫C語(yǔ)言有沒(méi)有好的工具呢,答案是肯定的。向大家推薦一款Source Insight軟件,使用方法大家自己摸索。
1.函數(shù)指針的聲明,初始化與調(diào)用
50.png (7.37 KB, 下載次數(shù): 106)
下載附件
2013-7-31 01:29 上傳
51.png (1.08 KB, 下載次數(shù): 112)
下載附件
2013-7-31 01:29 上傳
從這里大家可以看出,函數(shù)指針其實(shí)并沒(méi)有什么神奇的地方,與int *型的整型指針并無(wú)差異。需要說(shuō)明的是:對(duì)于函數(shù)的函數(shù)名其實(shí)就是一個(gè)地址,所以h = &welcome也可以寫為
h = welcome,一般都是這樣應(yīng)用,在上面只是為了做對(duì)比。
2.函數(shù)指針作為形參—回調(diào)函數(shù)的實(shí)現(xiàn)我們知道int *指針可以作為函數(shù)的參數(shù)進(jìn)行傳遞并參與運(yùn)算,但函數(shù)指針可不可以作為函數(shù)的參數(shù)進(jìn)行傳遞呢?下面以一個(gè)比較實(shí)用的單片機(jī)常見(jiàn)的例子按鍵處理函數(shù)為大家講解一下函數(shù)指針作為形參的應(yīng)用。在這里為了讓大家看到效果,將button定義為0
52.png (2.37 KB, 下載次數(shù): 130)
下載附件
2013-7-31 01:29 上傳
53.png (5.24 KB, 下載次數(shù): 116)
下載附件
2013-7-31 01:29 上傳
//按鍵處理函數(shù)
54.png (1.84 KB, 下載次數(shù): 108)
下載附件
2013-7-31 01:29 上傳
//主函數(shù)
55.png (1.61 KB, 下載次數(shù): 124)
下載附件
2013-7-31 01:29 上傳
56.png (1 KB, 下載次數(shù): 115)
下載附件
2013-7-31 01:29 上傳
3.實(shí)用typedef定義函數(shù)指針上面我們使用了void (*handler)(void)
57.png (7.46 KB, 下載次數(shù): 126)
下載附件
2013-7-31 01:29 上傳
作為參數(shù)進(jìn)行傳遞,我們可以實(shí)用typedef定義這個(gè)函數(shù)指針,使程序更加簡(jiǎn)潔。
改動(dòng)的地方如圖所示,效果上同,請(qǐng)自己測(cè)試。
修改的地方
58.png (3.73 KB, 下載次數(shù): 134)
下載附件
2013-7-31 01:29 上傳
4.綜合例子使用struct結(jié)構(gòu)體和函數(shù)指針結(jié)合實(shí)現(xiàn)模塊化編程的封裝
希望對(duì)大家有所啟發(fā)。
例子如下:
led.c的內(nèi)容如下:
59.png (8.13 KB, 下載次數(shù): 125)
下載附件
2013-7-31 01:29 上傳
led.h的內(nèi)容如下:
60.png (9.85 KB, 下載次數(shù): 129)
下載附件
2013-7-31 01:29 上傳
Main.c的內(nèi)容如下:
61.png (9.59 KB, 下載次數(shù): 119)
下載附件
2013-7-31 01:29 上傳
Main.c part1
62.png (10.46 KB, 下載次數(shù): 127)
下載附件
2013-7-31 01:29 上傳
Main.c part2
運(yùn)行結(jié)果:
62.png (1.57 KB, 下載次數(shù): 101)
下載附件
2013-7-31 01:30 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |