鄧麗萍
摘要:《C語(yǔ)言程序設(shè)計(jì)》是學(xué)生剛進(jìn)入大學(xué)所接觸的第一門編程語(yǔ)言,加上課時(shí)有限,大多數(shù)學(xué)生都覺得很難、很抽象不好學(xué),本文作者系統(tǒng)討論了如何用最短的時(shí)間使學(xué)生掌握好指針的應(yīng)用問題。經(jīng)驗(yàn)表明,在講解輸入函數(shù)的時(shí)候便介紹計(jì)算機(jī)內(nèi)部的存儲(chǔ)和變量地址的含義,在數(shù)組應(yīng)用時(shí)重點(diǎn)講解數(shù)組名表示數(shù)組首地址含義,這都將為指針的講解奠下基礎(chǔ),在講解指針時(shí),運(yùn)用一些簡(jiǎn)單經(jīng)典的例子來涵蓋指針的所有知識(shí),并取得了較好的效果。
關(guān)鍵詞:C語(yǔ)言;數(shù)組;教學(xué);指針
中圖分類號(hào):G718.5 ? ? 文獻(xiàn)標(biāo)志碼:A ? ? 文章編號(hào):1674-9324(2015)45-0228-02
在C語(yǔ)言的教學(xué)中,“指針”這一部分內(nèi)容一直是C語(yǔ)言的教學(xué)重點(diǎn)和難點(diǎn),直接影響學(xué)生對(duì)后續(xù)課程的學(xué)習(xí)和把握[1-3]。作為軟件開發(fā)入門課程,絕大多數(shù)時(shí)間是在講條件、循環(huán)、數(shù)組、函數(shù),而指針內(nèi)容卻是省、國(guó)家計(jì)算機(jī)二級(jí)、程序員等考試的必考內(nèi)容。為了在最短的時(shí)間內(nèi)達(dá)到較好的教學(xué)效果。筆者從多年的教學(xué)經(jīng)驗(yàn)認(rèn)為C語(yǔ)言的指針教學(xué)應(yīng)該注意以下幾點(diǎn):
一、輸入函數(shù)scanf()和數(shù)組中地址的應(yīng)用
所有的書本上都有介紹scanf(格式控制字符串,輸入項(xiàng)列表),此函數(shù)的輸入項(xiàng)列表要用“&”加變量名,要將所輸入的內(nèi)容放入變量的地址中,其中格式控制串中如果有普通字符也要輸入普通字符,且有很多輸入后不能正確讀取的情況,初學(xué)者往往感到非常困惑難以理解。其實(shí),連續(xù)定義的多個(gè)變量在內(nèi)存中也是占用連續(xù)的內(nèi)存單元,只是不同的數(shù)據(jù)類型所占的字節(jié)不同,程序在運(yùn)行過程中遇到第一個(gè)scanf()函數(shù)時(shí),將要求用戶從鍵盤上按要求輸入內(nèi)容,所有輸入的內(nèi)容都將先放入緩沖區(qū)且你可以輸入很多內(nèi)容,輸入完成后再按scanf的格式控制字符串的格式來存入到變量的地址中,一旦輸入不合法,則認(rèn)為輸入結(jié)束,后面的變量將取不到值。如:scanf(“%d:%d”,&a,&b);若輸入時(shí)你輸入3,4↙其中a的值為3,輸入格式串中本來要求你輸入的是“:”而你輸入的是“,”,明顯不合法,則scanf函數(shù)輸入結(jié)束,后面的變量b將取不到值。同時(shí)這也很好解釋了若程序中有多個(gè)scanf函數(shù)時(shí),為了保證每次輸入都有效,則應(yīng)該在輸入函數(shù)前加一個(gè)清空緩存函數(shù)fflush(stdin)。
數(shù)組名代表的是數(shù)組的首地址,所以在scanf()函數(shù)中以”%s”為格式串所對(duì)應(yīng)輸入項(xiàng)列表不需要加“&”。如:char str[20];
scanf(“%s”,str);/*將輸入的內(nèi)容存儲(chǔ)到從數(shù)組首地址開始的地址中*/
printf(“%s”,str);/*從數(shù)組的首地址開始輸出字符數(shù)組的內(nèi)容*/。
這些內(nèi)容都與計(jì)算機(jī)的實(shí)際存儲(chǔ)有關(guān)(即和地址有關(guān))。
二、指針
指針就是地址。其實(shí)前面我們?cè)谥v解輸入輸出函數(shù)和數(shù)組時(shí),我們就介紹了一些有關(guān)地址的應(yīng)用。一聽自己已經(jīng)用過且有所接觸了,學(xué)生也就不會(huì)感到太畏懼了。再加上時(shí)間有限,我們要言簡(jiǎn)意賅地說明指針的用法。
1.指針的概念。指針就是內(nèi)存地址。這里首先要區(qū)分三個(gè)比較接近的概念:名稱、地址和內(nèi)容(值)。名稱是給內(nèi)存空間取的一個(gè)容易記憶的名字;內(nèi)存中每個(gè)字節(jié)都有一個(gè)編號(hào),就是“地址”;在地址所對(duì)應(yīng)的內(nèi)存單元中存放的數(shù)值即為內(nèi)容或值。
為了幫助讀者理解三者之間的聯(lián)系與區(qū)別,我們不妨打個(gè)比方,有一座教師辦公樓,各房間都有一個(gè)編號(hào),如101,102,…,201,202,…。一旦各房間被分配給相應(yīng)的職能部門后,各房間就掛起了部門名稱:如電子系、計(jì)算機(jī)系、環(huán)境工程系等,假如電子系被分配在101房間,我們要找到電子系的教師(內(nèi)容),可以去找電子系(按名稱找),也可以去找101房間(按地址找)。類似地,對(duì)一個(gè)存儲(chǔ)空間的訪問既可以指出它的名稱,也可以指出它的地址。
在C語(yǔ)言中,如果變量p中的內(nèi)容是另一個(gè)變量i的地址,則稱變量p指向變量i,或稱p是指向變量i的指針變量,形象地用圖1所示的箭頭表示。
由此可以得出結(jié)論:變量的指針即為變量的地址,而存放其他變量地址的變量是指針變量。
指針變量是一種變量,因而也具有變量的三個(gè)要素,但它是一種特殊的變量,其特殊性表現(xiàn)在它的類型取值上。具體而言:①變量名:與一般的變量命名規(guī)則相同。②變量的值:是某個(gè)變量的內(nèi)存地址。③變量的類型:主要是其指向的變量的類型。
2.指針指向簡(jiǎn)單變量。
如:int a=100,*p;/*指針變量的定義*/
p=&a;/*指針變量的賦值*/
*p=200;/*指針變量的應(yīng)用*/
printf(“%d”,a);則輸出值為200。
在此我們要理解指針一旦定義且指向了一簡(jiǎn)單變量,除定義和初始化時(shí)的*p,其他的*p等價(jià)于它所指向的簡(jiǎn)單變量(即這里的*p<=>a),p(指針)等價(jià)于簡(jiǎn)單變量的地址(即這里的p<=>&a)。上面的輸出語(yǔ)句可以變?yōu)椋簆rintf(“%d”,*p)。
3.指針指向數(shù)組。
(1)指針指向一維數(shù)組。
如:int a[5]={10,20,30,40,50},*p=a;
p++;
printf(“%d,%d,%d”,*p,*(p+2),*p++);則輸出結(jié)果為:30,50,20
以上是指針指向一維數(shù)組的基本應(yīng)用,首先我們要理解有關(guān)指針的運(yùn)算。
&:取地址運(yùn)算符[5]。
*:指針運(yùn)算符(間址訪問運(yùn)算符),取指針?biāo)赶虻闹担羲赶蚨S數(shù)組則表示離取值進(jìn)了一步。
++:算術(shù)運(yùn)算符,表示指針往下或右移一個(gè)單位(其中這個(gè)單位和具體的數(shù)據(jù)類型有關(guān),如果是整型數(shù)一個(gè)單位就指2個(gè)字節(jié),實(shí)型指4個(gè)字節(jié))。
--:算術(shù)運(yùn)算符,表示指針往上或左移一個(gè)單位。
若定義了一個(gè)指針指向了一個(gè)一維數(shù)組,則p<=>a的使用(原來的a[i],也可以用p[i]表示,*p<=>*a),即*(p+i)<=>a[i] <=>p[i] <=>*(a+i)。但要注意p和a同為地址它們是有區(qū)別的,p為變量地址,而a是常量地址。有p++而不能用a++。
(2)指針指向二維數(shù)組。對(duì)于指針指向二維數(shù)組,要理解行地址和列地址的含義(*運(yùn)算符能實(shí)現(xiàn)行地址向列地址的轉(zhuǎn)換)再加上一維數(shù)組中的等價(jià)關(guān)系,能理解下面的二維數(shù)組的指針表示形式表即可。
(3)數(shù)組指針與指針數(shù)組的含義。前者是指針,后者是數(shù)組。定義格式:僅差一對(duì)圓括號(hào)。①指向一維數(shù)組的指針。假設(shè)有定義語(yǔ)句:int (*p)[4];②指針數(shù)組。假設(shè)有定義語(yǔ)句:int *p[4];
(4)應(yīng)用場(chǎng)合:前者是一個(gè)指針,后者是多個(gè)指針。①指向一維數(shù)組的指針。一般將一個(gè)二維數(shù)組名賦值給一個(gè)指向一維數(shù)組的指針,來訪問二維數(shù)組中的某一行。②指針數(shù)組。適合存放若干個(gè)字符串,使字符串的處理更加方便靈活。例如:
char ?*menu1[]={"Copy","Cut","Paste","Delete"};
char ?menu2[4][7]={"Copy","Cut","Paste","Delete"};
用字符指針數(shù)組處理字符串不僅可以節(jié)省內(nèi)存,還可以提高運(yùn)行效率。
4.指針指向函數(shù)。
(1)指針作為函數(shù)的參數(shù)。
其中左邊交換完后,能傳遞給實(shí)參,因?yàn)樗侵羔標(biāo)赶虻闹蛋l(fā)生交換,而右邊只是指針的指向發(fā)生改變?cè)局滴窗l(fā)生交換。
(2)指針函數(shù)與函數(shù)指針。這是兩個(gè)完全不同的概念,前者是函數(shù),后者是指針。
a定義格式:僅差一對(duì)圓括號(hào)。
①指針函數(shù)。假設(shè)有定義語(yǔ)句:
int ?*fp(int x,int y);
②指向函數(shù)的指針(函數(shù)指針)。假設(shè)有定義語(yǔ)句:
int ?(*fp)(int x,int y);
b應(yīng)用場(chǎng)合:前者是一個(gè)函數(shù),只是函數(shù)的返回值是指針;后者是一個(gè)指向函數(shù)的指針,通過這個(gè)指針可以間接地調(diào)用所指向的函數(shù)。
三、總結(jié)
本文探討了指針教學(xué)中,通過截取最基本且最重要的知識(shí)來解析其應(yīng)用問題,目的在于使學(xué)生在較短的時(shí)間內(nèi)掌握其基本知識(shí),預(yù)計(jì)可作為指針教學(xué)的有效方案之一。
參考文獻(xiàn):
[1]管銀枝.C語(yǔ)言程序設(shè)計(jì)實(shí)例教程[M].北京:人民郵電出版社,2011.
[2]譚浩強(qiáng).C程序設(shè)計(jì)(第二版)[M].北京:清華大學(xué)出版社,2001.
[3]白羽.C語(yǔ)言實(shí)用教程[M].北京:電子工業(yè)出版社,2009.