摘 要:C語(yǔ)言是程序語(yǔ)言的重點(diǎn),也是教學(xué)中的難點(diǎn),本文對(duì)C語(yǔ)言教學(xué)中由淺入深地講解了一些C語(yǔ)言的重難點(diǎn),通過(guò)用實(shí)例對(duì)它們的性質(zhì)進(jìn)行詳細(xì)的解讀,讓學(xué)生更好地理解其中的區(qū)別。
關(guān)鍵詞:C語(yǔ)言;指針;函數(shù);數(shù)組
一、 指針變量的引用
指針變量使用時(shí)對(duì)以下得幾點(diǎn)要格外注意:
1. 對(duì)指針變量要先下定義,定義后,再使用。
2. 對(duì)指針變量進(jìn)行操作時(shí),要保持類型的一致性。例如:int i=50;char *p=&i;;對(duì)上述指針進(jìn)行分析,可以得出上述指針是非法的。因?yàn)?int 后的i是整形變量,而char是定義字符變量,這兩個(gè)變量是不同類型的變量。
3. 當(dāng)使用賦值給指針變量時(shí),有一點(diǎn)要謹(jǐn)記,數(shù)值不可以直接賦值給指針變量,例如:int *p=52566,因?yàn)橹羔樧兞渴莾?chǔ)存其他變量的地址。
4. 指針變量在每次被調(diào)用時(shí),首先需要做的就是對(duì)初始變量進(jìn)行初始化,例如:int *p;printf(“*p is %d”);這樣的操作就是不合法的,當(dāng)程序員直接對(duì)變量進(jìn)行使用時(shí),沒(méi)有初始化,那就讓指針變量沒(méi)有所指。
5. 當(dāng)使用指針變量進(jìn)行算數(shù)運(yùn)算時(shí),不是變量p進(jìn)行加法運(yùn)算,直接變?yōu)閜+3,這樣是錯(cuò)誤的,舉個(gè)例子:int a[5]={0,1,2,3,4};int *p=a;p+3;語(yǔ)句中,而是讓指針變量指向a[3],做一個(gè)假設(shè)int 占用4個(gè)字符,p+3相當(dāng)于移動(dòng)了12個(gè)字符。
6. 指針變量中有三個(gè)變量,這三個(gè)變量學(xué)生常常會(huì)弄混,具體使用時(shí),就會(huì)犯錯(cuò)。關(guān)于這三個(gè)變量就是const int *p;int const *p;const int const *p。const int *p,修飾*p是個(gè)const常量.而*p是指向?qū)ο蟮膬?nèi)容.所以表示指向?qū)ο蟮膬?nèi)容是常量,const變量不能被直接賦值,但是可以通過(guò)指針來(lái)修改const變量。由于const局部變量會(huì)存在棧里,而const全局變量會(huì)存在只讀存儲(chǔ)內(nèi)存上所以我們可以通過(guò)指針來(lái)修改const局部變量,但是修改const全局變量,會(huì)使程序崩潰。const變量則是真正的常量了,定義時(shí)會(huì)將其放入符號(hào)表中。所以編譯途中遇到使用const變量時(shí),則直接從符號(hào)表中取出常量。只要當(dāng)該const變量為全局(使用extern聲明過(guò)),或者被使用&操作符時(shí),才會(huì)被分配存儲(chǔ)空間。int * const p,修飾 p是個(gè)const常量,而 p是指向?qū)ο蟮牡刂?所以表示指向?qū)ο蟮牡刂肥莻€(gè)常量。
二、 指針與數(shù)組
指向數(shù)組元素的指針變量的定義與以前的指針變量的定義一樣,有一點(diǎn)要注意的是保證數(shù)組的類型與指針變量的類型相同。例如:int i[5]={0,1,2,3,4};int *p=i;上述的兩條語(yǔ)句都是指向數(shù)組a的元素的指針向量p,同時(shí)對(duì)指針向量p進(jìn)行了初始化,指針變量指向了數(shù)組的首元素a[0]。完成上述步驟,接下來(lái)我們就可以訪問(wèn)數(shù)組元素了,通過(guò)使用指針變量p,例如:p+1就是指向a[1],很多學(xué)生在這里會(huì)迷惑,一定要記得,上述例子都是指針變量對(duì)一維數(shù)組元素進(jìn)行訪問(wèn),而現(xiàn)實(shí)中對(duì)二維或者多維的數(shù)組元素應(yīng)用比較多,所以我們對(duì)介紹一下二維數(shù)組的應(yīng)用方法。例如:int a[3][4];int *p=a;我們需要對(duì)數(shù)組的a[2][3]進(jìn)行訪問(wèn),為解決這個(gè)問(wèn)題,我們可以使用以下方法。
p+1很多同學(xué)錯(cuò)誤地理解為p單純地加1,其實(shí)是指針向量指出下一個(gè)數(shù)組元素。所以*(p+1)與a[1]等價(jià)。理解了上述的原理,我們可以很容易推理出以下規(guī)律,p+i(0≤i≤4)就可以表示p指向數(shù)組元素第a[i]元素,所以*(p+i)與a[i]等價(jià)。綜合上述的規(guī)律,我們可以推理出數(shù)組名與數(shù)組元素地址之間的聯(lián)系,所以有*(a+i)與*(p+i)等價(jià)。
1. 直接使用數(shù)組下標(biāo) a[2][3];
2. 利用一維數(shù)組名a訪問(wèn):*(a[2]+3)或*(a[0]+11)或 *(a[3]-1];
3. 利用二維數(shù)字名a進(jìn)行訪問(wèn),我們需要將(2)中的一維數(shù)組進(jìn)行改變,改成相應(yīng)的二維數(shù)組名,這樣就可以實(shí)現(xiàn)了。*(*(a+2)+3)或 *(*(a+0)+11)或*(*(a+3)-1);
4. 用指針變量p訪問(wèn):*(*(p+2)+3)或*(*(p+0)+11)或*(*(p+3)-1)等等。
三、 指針與函數(shù)
指針函數(shù)是指函數(shù)的返回值為指針類型,通俗地說(shuō)就是函數(shù)最后一個(gè)返回值,這個(gè)返回值不是一個(gè)數(shù)值,而是一個(gè)地址。指針函數(shù)的定義形式為:類型標(biāo)識(shí)符 * 函數(shù)名(參數(shù)名){函數(shù)體}。
對(duì)上述的案例進(jìn)行分析,上述實(shí)例中,我們需要先對(duì)全局變量a下定義,緊接著對(duì)變量a進(jìn)行初始化,初始化的值是6,我們?cè)趯?duì)指針函數(shù)fun( )下定義,其返回類型為指向整型的指針,參數(shù)列表為空。全局變量a的地址是由fun( )函數(shù)返回的。主函數(shù)中對(duì)指針變量p進(jìn)行定義,接著對(duì)p進(jìn)行初始化操作,使其指向fun( )函數(shù),接著輸出p所指向?qū)ο蟮闹?,最后的結(jié)果是*p=6。指針函數(shù)完成上述操作后,就會(huì)對(duì)所占用的內(nèi)存進(jìn)行釋放,釋放的內(nèi)存會(huì)被系統(tǒng)回收,所以指針函數(shù)不能返回局部變量的地址。
參考文獻(xiàn):
[1]彭蕾.C語(yǔ)言指針教學(xué)難點(diǎn)淺析[J].科技情報(bào)開(kāi)發(fā)與經(jīng)濟(jì),2007(05):218-220.
[2]浙江趙國(guó)龍,顧鵬堯.C語(yǔ)言學(xué)習(xí)中的四大難點(diǎn)[N].電腦報(bào),2003-09-15(C13).
作者簡(jiǎn)介:
陳坤,湖南省長(zhǎng)沙市,長(zhǎng)沙財(cái)經(jīng)學(xué)校。