楊 杰
(山西職業(yè)技術(shù)學(xué)院,山西 太原 030006)
C語言是一種基本的程序設(shè)計語言,它包含了很多數(shù)據(jù)類型,其中指針是它的精髓,可以表示并實(shí)現(xiàn)非常復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。在應(yīng)用C語言編程時,指針的使用頻率較高,有時甚至是解決問題的唯一途徑,而且可以通過應(yīng)用指針來提高程序的運(yùn)行速度。因此,是否能夠準(zhǔn)確靈活地應(yīng)用指針,是應(yīng)用C語言編程的一個關(guān)鍵。
在計算機(jī)中,所有的數(shù)據(jù)都是存放在存儲器中的,一般把存儲器中的一個字節(jié)稱為一個內(nèi)存單元,不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等。如整型量占兩個單元,字符量占一個單元等。為了正確地訪問這些內(nèi)存單元,必須為每個內(nèi)存單元編上號。根據(jù)一個內(nèi)存單元的編號,即可以準(zhǔn)確地找到該內(nèi)存單元。內(nèi)存單元的編號也叫地址。根據(jù)內(nèi)存單元的地址,就可以找到所需的內(nèi)存單元,所以通常也把這個地址稱為指針。
基本類型指針?biāo)傅臄?shù)據(jù)類型是簡單的數(shù)據(jù)類型,可以是整型、實(shí)型、字符型。
上例中,定義了一個整型變量p1以及一個整型數(shù)據(jù)的指針p,并把整型變量p1的內(nèi)存單元的地址(&p1)賦值給了整型數(shù)據(jù)指針p。
該指針?biāo)傅臄?shù)據(jù)類型是一個數(shù)組,該數(shù)組可以是一維數(shù)組、二維數(shù)組或多維數(shù)組。
上例中,定義了一個整型的一維數(shù)組str,還定義了一個整型數(shù)據(jù)的指針p1,最后又把數(shù)組名str賦值給了指針p1,對于一個一維數(shù)組來說,數(shù)組名str表示該數(shù)組中第一個元素str[0]的地址,即該數(shù)組的首地址。也就是說相當(dāng)于把數(shù)組str的首地址&str[0]賦值給了整型指針p1。
二級指針也就是指指針變量所指向的是某一個指針的地址。
上例中,定義了一個整型變量score,一個整型指針p1,又定義了一個二級指針pp。之后把整型變量score的地址賦值給了一級指針p1,即p1中存放的是整型變量score的首地址。最后又將一級指針p1的地址賦值給了二級指針pp,即二級指針pp中存放的是一級指針p1的地址。如果將二級指針pp的地址賦值給某一個指針的話,該指針就為三級指針。同理,可以派生出多級指針。
指向函數(shù)的指針就是指指針變量所指向的是函數(shù)的首地址,因此可以通過引用該指針變量來調(diào)用該函數(shù)。
上例中定義了一個整型指針f,該指針變量指向一個函數(shù),也就是存放了該函數(shù)在內(nèi)存中的存儲地址。定義了一個函數(shù)p,p中定義了兩個整型變量作為參數(shù),并且返回值也為整型。最后將函數(shù)p賦值給了指針f,f指向函數(shù)p,也就是將函數(shù)p的首地址賦值給了指針f。
指針數(shù)組就是指該數(shù)組的數(shù)組元素是由指針變量構(gòu)成的。即每一個數(shù)組元素都是一個指針。
上例中,定義了一個指針pa,該指針指向的是一個有五個元素的數(shù)組,并且該數(shù)組的每一個元素都是整型變量。又定義了一個整型數(shù)組arr,有五個數(shù)組元素;最后將arr賦值給了pa,也就是將一個整型數(shù)組arr的地址賦值給了一個整型數(shù)組的指針怕。滿足賦值關(guān)系左右兩邊應(yīng)該保持一致性的條件。
結(jié)構(gòu)體類型指針和基本數(shù)據(jù)類型指針變量類似,主要就是用來存儲結(jié)構(gòu)體類型變量的地址以及結(jié)構(gòu)體類型數(shù)組的地址,因此,我們可以采用間接方式來對對應(yīng)的變量與數(shù)組進(jìn)行操作。C語言中,結(jié)構(gòu)體類型指針變量能夠參與“+”“*”“++”“--”“,”“.”“,”“->”“&|”等運(yùn)算符的運(yùn)算。
上例中,首先定義了一個結(jié)構(gòu)體類型struct Teacher,在該結(jié)構(gòu)體中定義了一個整型變量num和字符型數(shù)組name,之后定義了一個結(jié)構(gòu)體類型struct Teacher的指針pa,以及該結(jié)構(gòu)體變量m,并將m的地址賦值給了指針pa,指針pa表示的是一個包含4個字節(jié)的地址,而結(jié)構(gòu)體變量m則表示是一個占有24個字節(jié)的實(shí)際存在的結(jié)構(gòu)體內(nèi)容。
與簡單變量一樣,指針變量在使用之前必須進(jìn)行聲明。聲明的格式為:類型標(biāo)識符 *變量名;表示定義了一個指針變量,并且說明了本指針變量指向變量的數(shù)據(jù)類型。值得注意的是,一個指針變量只能指向與它類型相同的變量。
如果一個指針沒有進(jìn)行初始化的話,它的值是不確定的,也就是說,它的指向是不確定的。如果使用這樣的指針可能會給系統(tǒng)帶來災(zāi)難性的后果,系統(tǒng)不能正常運(yùn)行。
在上例中,指針pa未進(jìn)行初始化,應(yīng)該在循環(huán)語句for語句之前加上一條“pa=s”語句,從而初始化pa。
我們知道,指針變量存放的是一個內(nèi)存單元的地址,因此它的值只能是正整數(shù),決不能是一個負(fù)數(shù),和整數(shù)類型變量是有其區(qū)別的。
上例中,“pa=a1;”是一條錯誤的賦值語句,應(yīng)改為“pa=&a1;”。
上例中,“pt=student();”語句是將student()函數(shù)的函數(shù)值賦值給指針變量pt,應(yīng)直接用函數(shù)名,應(yīng)改為“pt=student;”。
在定義函數(shù)時,循環(huán)結(jié)構(gòu)中使指針指向下一結(jié)點(diǎn)的語句錯誤。
其中w指向的是一個鏈表中的某個結(jié)點(diǎn),是動態(tài)分配的,不一定連續(xù),而w++只有當(dāng)w指向連續(xù)的存儲空間時,w才指向下一元素。因此,用w++來表示下一個結(jié)點(diǎn)是不合適的。
在指針運(yùn)算中,我們可以通過取內(nèi)容*運(yùn)算來得到數(shù)值,對于一個m級指針來說,進(jìn)行m次取內(nèi)容*運(yùn)算后得到的為數(shù)值,而進(jìn)行0到m-1次取內(nèi)容運(yùn)算結(jié)果都是地址。
上例中,a是一個二維數(shù)組名,與二級指針類似,*a表示地址,**a則表示整型數(shù)據(jù)。數(shù)組名a不能夠表示數(shù)組元素的首地址,而是表示有三個元素的第0行的地址,所以在編譯時會出現(xiàn)錯誤。應(yīng)改為:p1=&a[0][0]或者p1=a[0]。
指針數(shù)據(jù)類型的應(yīng)用是C語言的精髓,論文僅僅分析了指針的一些常用形式,以及在應(yīng)用指針完成簡單程序編寫的過程中,容易出現(xiàn)的一些典型錯誤,希望能使初學(xué)者更好地熟悉指針,并能更靈活地應(yīng)用指針完成簡單程序編寫。
[1]溫娟娟.C語言中指針的探討[J].河南職業(yè)技術(shù)師范學(xué)院學(xué)報,2003,(3).
[2]高宏娟.C語言中“指針”的教學(xué)方法探討[J].科技信息,2011,(8).
[3]劉軍.C程序設(shè)計教學(xué)探討[J].電腦知識與技術(shù),2011,(18).
[4]譚浩強(qiáng).C程序設(shè)計[M].北京:清華大學(xué)出版社,2005.