李柯景,魯光男
(長(zhǎng)春大學(xué) 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,長(zhǎng)春 130022)
經(jīng)過(guò)多年承擔(dān)C語(yǔ)言程序設(shè)計(jì)這門(mén)課的教學(xué)任務(wù),筆者發(fā)現(xiàn)學(xué)生在初學(xué)指針的時(shí)候,理解和掌握關(guān)于指針的基本概念并不是很難,但往往在學(xué)完指針的基本使用方法之后還是不能夠深刻理解指針在C語(yǔ)言中的重要作用。因此,筆者對(duì)C語(yǔ)言使用指針的必要性做簡(jiǎn)要的總結(jié),便于學(xué)生更好的掌握和理解指針的概念,靈活的應(yīng)用指針。
在C語(yǔ)言程序設(shè)計(jì)中,我們可以通過(guò)變量的指針(即變量的內(nèi)存地址)來(lái)引用內(nèi)存單元的值,這種方式稱(chēng)為間接訪問(wèn)。對(duì)于數(shù)組,采用指針變量自增運(yùn)算引用數(shù)組元素要比利用數(shù)組名稱(chēng)直接訪問(wèn)的方式執(zhí)行效率高。
比如:
程序段1(利用數(shù)組下標(biāo)變化訪問(wèn)):
程序段2(利用指針間接訪問(wèn))
以上兩個(gè)程序段完成的功能都是一樣的,都是讓數(shù)組s中的所有元素的值均為0。程序段1中,每尋址一個(gè)數(shù)組元素都要進(jìn)行地址的算術(shù)運(yùn)算,即a[i]=*(a+i)。要通過(guò)數(shù)組名加上偏移量來(lái)實(shí)現(xiàn)對(duì)每個(gè)數(shù)組元素的訪問(wèn)。而程序段2只需要通過(guò)指針的自增運(yùn)算來(lái)實(shí)現(xiàn)對(duì)數(shù)組元素的訪問(wèn)。由于自增運(yùn)算的執(zhí)行效率較高,因此程序段2的執(zhí)行效率要比程序段1的高。
C語(yǔ)言中利用字符數(shù)組存放字符串,可以方便地使用指向字符的指針變量操作字符串。通過(guò)指針的移動(dòng)來(lái)實(shí)現(xiàn)對(duì)不同位置字符的訪問(wèn)。如果是多個(gè)字符串還可以通過(guò)字符型指針數(shù)組來(lái)實(shí)現(xiàn)對(duì)多個(gè)字符串的靈活處理。如程序1:
對(duì)于"Melissa","Bob","Tom","Peter"這四個(gè)長(zhǎng)度不等的字符串,可以采用字符數(shù)組進(jìn)行存放。由于二維數(shù)組的列數(shù)是相等的,若采用二維數(shù)組進(jìn)行存放則比較浪費(fèi)存儲(chǔ)空間。采用字符數(shù)組則可以解決這個(gè)問(wèn)題。可以通過(guò)循環(huán),利用指針數(shù)組元素下標(biāo)的變化來(lái)實(shí)現(xiàn)對(duì)不同字符串的訪問(wèn),大大提高了程序的效率。
每個(gè)指針數(shù)組元素對(duì)應(yīng)一個(gè)字符串,倘若相對(duì)多個(gè)字符串求最大值或者進(jìn)行排序操作,只需要通過(guò)改變指針數(shù)組中個(gè)元素的指向,就可以實(shí)現(xiàn),節(jié)約了大量移動(dòng)數(shù)據(jù)的步驟,程序的效率得到提高。
函數(shù)指針為指向函數(shù)的指針[4]。函數(shù)在內(nèi)存中占據(jù)連續(xù)的一片存儲(chǔ)單元,而函數(shù)名就是這片存儲(chǔ)單元的首地址??梢酝ㄟ^(guò)對(duì)指向函數(shù)的指針變量的訪問(wèn)來(lái)完成對(duì)函數(shù)的調(diào)用。如程序2所示:
程序2中,定義了一個(gè)指向函數(shù)的指針數(shù)組,數(shù)組中的兩個(gè)元素分別指向函數(shù)sqrt和fabs。因此當(dāng)鍵盤(pán)上輸入數(shù)據(jù)data后,根據(jù)用戶(hù)的選擇就可以實(shí)現(xiàn)對(duì)所輸入的數(shù)據(jù)進(jìn)行開(kāi)平方或者求絕對(duì)值的操作。對(duì)這兩個(gè)函數(shù)的調(diào)用,是通過(guò)訪問(wèn)指針數(shù)組元素來(lái)實(shí)現(xiàn)的。
倘若程序中所需要調(diào)用的函數(shù)不僅僅有兩個(gè),而是更多。那么就需要用多個(gè)的if語(yǔ)句或swich結(jié)構(gòu)去判斷哪個(gè)函數(shù)被調(diào)用哪個(gè)不被調(diào)用。那就需要大量的代碼。若采用指向函數(shù)的指針數(shù)組來(lái)完成則可以省略大量的代碼書(shū)寫(xiě)。通過(guò)指針數(shù)組下標(biāo)的變化實(shí)現(xiàn)對(duì)不同函數(shù)的調(diào)用,省去了大量編寫(xiě)代碼的工作量,代碼的執(zhí)行效率也得到提高。
通過(guò)以上的介紹,靈活的使用指針,可以使某些程序的效率得到提高。此外,當(dāng)函數(shù)間參數(shù)傳遞時(shí),尤其是大量數(shù)據(jù)的參數(shù)(例如結(jié)構(gòu)體變量等),將它們地的址作為參數(shù)傳給函數(shù),這樣可以省去編譯器為它們制作副本所帶來(lái)的空間和時(shí)間上的開(kāi)銷(xiāo),從而提高了程序的效率。由此可見(jiàn),靈活的使用指針進(jìn)行編程,在提高程序效率方面起著重要的作用。
當(dāng)普通變量作函數(shù)參數(shù)時(shí),只能通過(guò)return語(yǔ)句得到一個(gè)返回值,若被調(diào)函數(shù)中沒(méi)有返回值,則無(wú)論形參如何變化,主調(diào)函數(shù)中的值是不會(huì)發(fā)生改變的。如程序3所示:
程序3:
在swap函數(shù)中實(shí)現(xiàn)了變量p和q的交換,但程序的輸出結(jié)果仍然為a=3,b=4。若將程序修改為指針變量作為函數(shù)參數(shù)如程序4所示:
程序4:
該程序的運(yùn)行結(jié)果為:a=4,b=3。實(shí)現(xiàn)了a與b的真正交換。由此可見(jiàn),使用指針變量作為函數(shù)的參數(shù),可以得到多個(gè)變化的值。而不是只能得到一個(gè)返回值。
指針為C語(yǔ)言的動(dòng)態(tài)內(nèi)存分配系統(tǒng)提供支持。
例如:統(tǒng)計(jì)本班學(xué)生C語(yǔ)言程序設(shè)計(jì)這門(mén)課的總分和平均分??梢岳脭?shù)組來(lái)進(jìn)行編程。由于數(shù)組的大小要在定義時(shí)確定,不能夠在程序運(yùn)行時(shí)動(dòng)態(tài)分配,因此必須事先確定數(shù)組的大小,即班級(jí)的人數(shù)。假如班級(jí)有35名學(xué)生,就需要根據(jù)分?jǐn)?shù)的數(shù)據(jù)類(lèi)型來(lái)分配連續(xù)的一片存儲(chǔ)單元來(lái)存放相應(yīng)的分?jǐn)?shù)。假如程序要修改為對(duì)全年級(jí)350人進(jìn)行統(tǒng)計(jì),這期間還有其他原因造成參加考試人員的增減。那么預(yù)先分配的數(shù)組大小就要發(fā)生改變。倘若個(gè)數(shù)以最大計(jì)則造成了存儲(chǔ)空間的浪費(fèi),分配太小則又無(wú)法臨時(shí)改變數(shù)組的大小。此時(shí),我們可以利用指針來(lái)實(shí)現(xiàn)對(duì)內(nèi)存的臨時(shí)分配。
在C語(yǔ)言中可以利用動(dòng)態(tài)分配函數(shù)malloc()或calloc()為指針變量分配內(nèi)存,建立動(dòng)態(tài)數(shù)組。例如:int*p;
表示向系統(tǒng)申請(qǐng)5個(gè)連續(xù)的整型數(shù)相應(yīng)大小的存儲(chǔ)空間,p指向了這段存儲(chǔ)空間的首地址。
又如:float*q;
表示向系統(tǒng)申請(qǐng)5個(gè)連續(xù)的的float類(lèi)型的存儲(chǔ)單元,p指向了該連續(xù)存儲(chǔ)單元的首地址。
在初學(xué)C語(yǔ)言過(guò)程中,處理數(shù)據(jù)的過(guò)程都是從鍵盤(pán)上輸入數(shù)據(jù),在經(jīng)過(guò)運(yùn)行后讓結(jié)果顯示在屏幕上。在程序的執(zhí)行過(guò)程當(dāng)中,所處理的數(shù)據(jù)都是保存在內(nèi)存中的。而內(nèi)存只是臨時(shí)保存數(shù)據(jù),當(dāng)程序運(yùn)行結(jié)束之后,輸入的數(shù)據(jù)和運(yùn)行的結(jié)果都會(huì)丟失。要想達(dá)到永久保存數(shù)據(jù)和重復(fù)使用數(shù)據(jù)的目的,需要將數(shù)據(jù)以文件的形式存儲(chǔ)在外部存儲(chǔ)器上。
ANSIC標(biāo)準(zhǔn)規(guī)定C語(yǔ)言處理文件采用緩沖型文件系統(tǒng),在緩沖型文件系統(tǒng)中,每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)區(qū),用來(lái)存放文件的有關(guān)信息,這些信息保存在成為FILE的結(jié)構(gòu)類(lèi)型的變量中[5]。讀寫(xiě)文件要通過(guò)文件指針來(lái)實(shí)現(xiàn)。只要是指針指向一個(gè)C文件,便可以通過(guò)該指針變量實(shí)現(xiàn)對(duì)文件信息的訪問(wèn)。如程序5所示:
該程序利用文件指針fp將磁盤(pán)文件a.cpp的內(nèi)容輸出到屏幕上,實(shí)現(xiàn)了磁盤(pán)文件的訪問(wèn)。
通過(guò)以上介紹,指針的重要作用包括:利用指針可以提高程序的執(zhí)行效率,靈活的實(shí)現(xiàn)字符串操作,實(shí)現(xiàn)對(duì)文件的訪問(wèn)等等。因此,指針在C語(yǔ)言中具有重要的地位,學(xué)好指針并靈活的使用指針進(jìn)行編程,是是否掌握好C語(yǔ)言的一個(gè)重要標(biāo)志。
[1]姚合生.C語(yǔ)言程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2008.
[2]譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2005.
[3]李霞.C語(yǔ)言指針的應(yīng)用[J].科技創(chuàng)新導(dǎo)報(bào),2009(4):21-23.
[4]汪明光.C++語(yǔ)言中函數(shù)指針的分析與應(yīng)用[J].巢湖學(xué)院學(xué)報(bào),2006,8(3):30-34.
[5]蘇小紅,陳惠鵬,溫東新,李秀坤.C語(yǔ)言程序設(shè)計(jì)教程[M].北京:電子工業(yè)出版社,2004.