文章編號(hào):1962-5913(2008)15-0111-04
摘要:指針是C語言的重點(diǎn),也是教學(xué)難點(diǎn)。本文基于計(jì)算機(jī)教學(xué)實(shí)踐,分析了邊疆學(xué)生學(xué)習(xí)C語言指針過程中存在問題的原因,提出了適用的教學(xué)方法,提高學(xué)生理解和應(yīng)用指針的能力,進(jìn)一步增強(qiáng)教學(xué)效果。
關(guān)鍵詞:指針;教學(xué)現(xiàn)狀;教學(xué)方法
中圖分類號(hào):G642
文獻(xiàn)標(biāo)識(shí)碼:B
1引言
C語言是程序設(shè)計(jì)語言中專業(yè)性較強(qiáng)的語言[1,2],為適應(yīng)信息化社會(huì)對(duì)人才培養(yǎng)的要求,我區(qū)各高校普遍開設(shè)了C語言程序設(shè)計(jì)這門課。由于我區(qū)是少數(shù)民族居住區(qū),各高校少數(shù)民族學(xué)生占較高比列,他們雖然具有一定的漢語水平,但是在學(xué)習(xí)計(jì)算機(jī)課程時(shí)對(duì)專業(yè)詞語生疏,因此在語言理解方面存在較大困難。指針又是C語言的精華,指針變量提供對(duì)內(nèi)存單元的間接訪問方式,不同于以往的直接訪問方式。同時(shí),指針數(shù)據(jù)類型繁多,書寫格式相近,使用不當(dāng)容易引起混亂。這些加大了少數(shù)民族學(xué)生對(duì)指針的理解難度。但是另一方面,利用指針可以對(duì)不同數(shù)據(jù)結(jié)構(gòu)進(jìn)行快速處理,還可以為函數(shù)間各類數(shù)據(jù)的傳遞提供簡(jiǎn)便方法,靈活應(yīng)用指針,可以編寫出簡(jiǎn)潔、緊湊、高效的程序。指針是教學(xué)的重點(diǎn),學(xué)生不僅要理解而且要靈活應(yīng)用。為了突破教學(xué)中的難點(diǎn),本文先對(duì)指針內(nèi)容和教學(xué)現(xiàn)狀進(jìn)行了分析研究,在此基礎(chǔ)上提出了適用的教學(xué)方法,目的是進(jìn)一步提高邊疆地區(qū)C 語言的教學(xué)效果。
2指針教學(xué)內(nèi)容和教學(xué)現(xiàn)狀的分析研究
2.1指針的特點(diǎn)決定學(xué)習(xí)難度
(1) 概念多,易混淆
在指針章節(jié)中,許多概念容易混淆,如變量的指針和指針變量,指針數(shù)組和數(shù)組指針,指針函數(shù)和函數(shù)指針等。變量的指針是變量的地址,指針變量是專門存放地址的變量;指針數(shù)組是每個(gè)元素均為指針變量的數(shù)組,而數(shù)組指針是指向數(shù)組的指針;指針函數(shù)是返回值為指針的函數(shù),而函數(shù)指針是函數(shù)的首地址。微小的差別,卻表示不同概念。
(2) 數(shù)據(jù)類型多
引入指針概念后,可以定義出許多新的數(shù)據(jù)類型。如:整型指針變量、字符型指針變量、實(shí)型指針變量;整型指針數(shù)組、字符型指針數(shù)組、實(shí)型指針數(shù)組;指向一維整型數(shù)組的數(shù)組指針、指向一維字符型數(shù)組的數(shù)組指針等,并且數(shù)組下標(biāo)值不同或數(shù)組維數(shù)不同,表示定義了不同的數(shù)組指針變量;除此之外,還有指針函數(shù)類型和函數(shù)指針類型以及指向指針的指針數(shù)據(jù)類型等。
(3) 語法要求苛刻
指針內(nèi)容的語法細(xì)節(jié)要求嚴(yán)格,如:(*p)++和*(p++),p為指針變量,僅括號(hào)位置不同,表示不同意義。前者表示p所指向變量的值加1,后者表示先對(duì)p的原值進(jìn)行*運(yùn)算,然后使p的值改變。
(4) 指針應(yīng)用靈活
指針應(yīng)用非常靈活,可以應(yīng)用于普通變量,數(shù)組,字符串,函數(shù)等,對(duì)所指向的數(shù)據(jù)進(jìn)行操作。熟練的編程人員,利用它可以編寫出頗具特色、高質(zhì)量的程序,實(shí)現(xiàn)其它高級(jí)語言難以實(shí)現(xiàn)的功能,但是初學(xué)者應(yīng)用指針十分容易出錯(cuò)。
2.2教學(xué)現(xiàn)狀
(1) 教學(xué)目標(biāo)
掌握指針類型及其表示方法;應(yīng)用指針訪問數(shù)組;應(yīng)用指針對(duì)字符串進(jìn)行操作;了解指向函數(shù)的指針和返回指針值的函數(shù)概念;了解指向指針的指針概念。
(2) 教學(xué)內(nèi)容及安排
①指針,指針類型,指針變量。具體包括:地址和指針概念;定義、引用指針變量;指針變量作函數(shù)參數(shù)。
② 數(shù)組與指針。具體包括:應(yīng)用指針訪問一維數(shù)組元素;用數(shù)組名作為函數(shù)參數(shù);了解指針訪問多維數(shù)組元素等。
③ 字符串與指針。具體包括:字符串表示形式;應(yīng)用字符串指針作函數(shù)參數(shù);應(yīng)用字符串指針變量實(shí)現(xiàn)對(duì)字符串操作。
④ 函數(shù)與指針。具體包括:函數(shù)指針變量的定義和引用;返回指針值的函數(shù)的定義和引用。
⑤ 指向指針的指針概念。
(3) 教學(xué)現(xiàn)狀分析
目前,大多數(shù)高校采用先進(jìn)的多媒體設(shè)備輔助教學(xué),增強(qiáng)了課堂教學(xué)的新穎性和生動(dòng)性,但是教學(xué)方式仍局限于傳統(tǒng)方式——從語法角度按部就班地羅列語法知識(shí),并且多媒體教學(xué)過多追求情節(jié)和畫面,分散了學(xué)生的注意力,使學(xué)生對(duì)指針的理解過于膚淺,作題時(shí)不知所措。每學(xué)期期末,在對(duì)本校非計(jì)算機(jī)專業(yè)學(xué)生C語言試卷調(diào)查中發(fā)現(xiàn):即使指針試題是判斷題或選擇題,90%的學(xué)生仍會(huì)失分。
教學(xué)實(shí)踐證明:對(duì)于抽象復(fù)雜的指針概念,采用板書的教學(xué)方式,教學(xué)效果明顯高于多媒體。一方面:教師在黑板上書寫過程中,學(xué)生有充分時(shí)間理解和思考;另一方面:教師可以根據(jù)學(xué)生的反應(yīng),靈活調(diào)整授課內(nèi)容或者改變教學(xué)方法。以下,根據(jù)指針內(nèi)容概念多,難理解;數(shù)據(jù)類型多,難區(qū)分;語法細(xì)節(jié)多,使用靈活等特點(diǎn),本文提出了適用的教學(xué)方法。
3指針教學(xué)方法探討
3.1由已知學(xué)習(xí)未知,進(jìn)行比較和對(duì)照
知識(shí)和技能的悉得,除掌握正確方法外,還需要扎實(shí)基礎(chǔ),學(xué)習(xí)C語言也不例外。學(xué)生對(duì)C語言基礎(chǔ)知識(shí)掌握的熟練程度,直接影響指針的教學(xué)質(zhì)量。在指針章節(jié)中,大部分內(nèi)容與前面知識(shí)有關(guān),在教學(xué)過程中,如果忽略概念間的相似點(diǎn),將耗費(fèi)學(xué)生較多精力學(xué)習(xí)新內(nèi)容;如果缺乏概念間的對(duì)比,將使學(xué)生很難深刻理解所學(xué)內(nèi)容,容易引起混淆。
以學(xué)習(xí)“指針變量”為例,首先應(yīng)該清楚“指針變量”也是“變量”,固具有“變量”的特點(diǎn),如:變量值可以改變;任何變量名必須先定義,后使用;變量名表示一個(gè)符號(hào)地址等。其次,要明白“指針變量”與“變量”的區(qū)別:指針變量的存儲(chǔ)單元中,存放的是地址值而非數(shù)值。由此“指針變量”與“變量”之間的聯(lián)系和區(qū)別總結(jié)如下:
(1) 指針變量的值可以改變;不過其值一旦改變,表示指向不同存儲(chǔ)單元。
(2) 在引用指針變量之前必須先定義,標(biāo)識(shí)符即為指針變量名;與一般變量的定義不同的是:指針變量的數(shù)據(jù)類型與它本身沒有關(guān)系,僅表示它所指向的數(shù)據(jù)的數(shù)據(jù)類型;變量名前需加“*”;此外,在引用之前,還必須將相應(yīng)類型變量的地址先賦給指針變量,以確保指針變量有確切指向,不至于破壞內(nèi)存中的系統(tǒng)數(shù)據(jù)。
(3) 雖然指針變量存取的是地址值,但是同一般變量一樣,指針變量名也表示一個(gè)符號(hào)地址,編譯時(shí)為其分配存儲(chǔ)單元。
以下通過表1,對(duì)比變量與指針變量的定義和引用形式:
程序1運(yùn)行時(shí),變量i的內(nèi)存狀態(tài)如圖1所示:
程序2運(yùn)行時(shí),變量i和p的內(nèi)存狀態(tài)如圖2所示:
分析說明:如果把存儲(chǔ)單元比喻成房間,則內(nèi)存地址相當(dāng)于房號(hào)。C語言的內(nèi)存地址是一個(gè)從0 到65535之間的整型值。編譯時(shí)系統(tǒng)自動(dòng)為每個(gè)變量(包括指針變量)隨機(jī)分配內(nèi)存地址。如:程序1中變量i的內(nèi)存地址是3001;程序2中變量i的內(nèi)存地址是2301,指針變量p的內(nèi)存地址是4000。程序2中語句“p=i;”相當(dāng)于“p=2301;”,其作用是使p指向了i;語句“*p=20;”相當(dāng)于“i=20;”,作用是將數(shù)值20寫入i所在的存儲(chǔ)單元。
這種幫助學(xué)生充分利用所學(xué)知識(shí)和經(jīng)驗(yàn),理解和掌握新內(nèi)容的方法,在認(rèn)知心理學(xué)領(lǐng)域稱為“正遷移”。文獻(xiàn)[3]提出,在教學(xué)過程中,如果能全面了解和準(zhǔn)確把握遷移規(guī)律,將有效增強(qiáng)學(xué)生的認(rèn)知能力和記憶能力,提高學(xué)習(xí)成績(jī)。實(shí)踐證明:新、舊知識(shí)之間進(jìn)行比較和對(duì)照(對(duì)照顯現(xiàn)出相同,比較體現(xiàn)出差異),將有助于學(xué)生快速發(fā)現(xiàn)遷移規(guī)律。如果運(yùn)用同樣的方法,由數(shù)組學(xué)習(xí)指針數(shù)組,由函數(shù)學(xué)習(xí)指針函數(shù),由指針變量學(xué)習(xí)指向指針的指針變量等,那么指針的教學(xué)難度將明顯降低,學(xué)生將快速而有效地掌握更深層次的指針概念。
3.2善于羅列和總結(jié)
針對(duì)指針概念多、數(shù)據(jù)類型多,易混淆的特點(diǎn),在教學(xué)過程中,如果善于發(fā)現(xiàn)規(guī)律,對(duì)所學(xué)知識(shí)進(jìn)行“羅列和總結(jié)”,那么將增強(qiáng)知識(shí)結(jié)構(gòu)的系統(tǒng)性和完善性,同時(shí)將零碎的知識(shí)點(diǎn)串聯(lián)起來,提高學(xué)生的記憶能力和辨別能力,進(jìn)一步改善教學(xué)效果。
以數(shù)組與指針為例,學(xué)習(xí)了指針之后,運(yùn)用指針法同樣可以表示數(shù)組元素,且該方法使目標(biāo)程序占內(nèi)存少,運(yùn)行速度更快。但是面對(duì)下標(biāo)法和指針法引出的多種表示形式,初學(xué)者往往難以準(zhǔn)確區(qū)分,使用時(shí)容易出錯(cuò)。表2對(duì)兩種表示數(shù)組元素的方法進(jìn)行了全面總結(jié)。
說明:表中a代表數(shù)組名,p代表指針變量名,p的初值為a(p所指向的數(shù)據(jù)的數(shù)據(jù)類型與a數(shù)組元素的數(shù)據(jù)類型一致)。下標(biāo)法中a[i]表示數(shù)組元素的值,a[i]表示數(shù)組元素的地址;指針法中*(p+i) 表示數(shù)組元素的值,p+i表示數(shù)組元素的地址,這些表示形式學(xué)生容易理解。但是,下標(biāo)法“*(a+i), a+i”和指針法“p[i],p[i] ”這兩種表示形式比較抽象,學(xué)生不易理解,需要進(jìn)行簡(jiǎn)單推理。觀察表2后發(fā)現(xiàn):下標(biāo)法“*(a+i), a+i”與指針法“*(p+i), p+i”類似,之所以也可以這樣表示,原因在于p的初始值為a,則a+i 和p+i都指向a數(shù)組第i個(gè)元素;指針法“p[i],p[i] ”與數(shù)組法“a[i],a[i] ”類似,原因在于“[ ]”是變址運(yùn)算符,a[i]表示按a+i計(jì)算地址,再取值,而p+i和a+i含意相同,則p[i]等價(jià)于a[i]。
通過全面的總結(jié)和簡(jiǎn)單推理,初學(xué)者將比較容易掌握所有表示方法,并且牢記各種表示形式的真實(shí)含義,使用時(shí)能輕松駕馭,不致于混淆出錯(cuò)。
理解了指針與一維數(shù)組的關(guān)系,對(duì)于二維數(shù)組的表示形式,也可以通過“總結(jié)”的方法,加深理解記憶[4]。如語句:int a[3][4]; 定義了一個(gè)三行四列的整型二維數(shù)組,共十二個(gè)元素,見圖3 (在內(nèi)存中,依據(jù)按行存放的原則) ,把二維數(shù)組a看作是一個(gè)特殊的一維數(shù)組,它有三個(gè)元素:a[0],a [1],a [2];每個(gè)元素又是一個(gè)一維數(shù)組,如a [0]是四個(gè)元素:a [0] [0],a[0] [1],a[0] [2],a[0] [3]的數(shù)組名,以此類推。
根據(jù)二維數(shù)組的特點(diǎn),指針分為行指針和列指針,行指針有兩種表示形式:“a+i和a[i]”。由圖3學(xué)生很容易理解“a+i”表示行指向的指針,此外“a[i]”也表示行指針,原因是:此時(shí)a[i]為一維數(shù)組的數(shù)組名,表示列指針,而列指針前加上“”就轉(zhuǎn)換成行指針了。需要強(qiáng)調(diào)的是:二維數(shù)組的行指針只指向具體的行地址,二維數(shù)組的列指針才指向具體的存儲(chǔ)單元,按照指針訪問方式的不同,對(duì)二維數(shù)組的數(shù)組元素的各種表示形式總結(jié)如下(見表3,其中 ):
經(jīng)過總結(jié),二維數(shù)組元素的各種表示形式就容易區(qū)分了。
在教學(xué)過程中,要善于發(fā)現(xiàn)規(guī)律,這樣才便于從不同角度對(duì)指針內(nèi)容進(jìn)行總結(jié),發(fā)現(xiàn)知識(shí)點(diǎn)之間的相關(guān)性,將零散的知識(shí)串聯(lián)起來,加深理解和記憶。如:指針章節(jié)中,起始至終都貫穿著指針變量,那么從指針變量的主要用途出發(fā)進(jìn)行總結(jié),見表4:
由上表可以看出,指針變量用途廣泛:使用指向單變量的指針變量作為函數(shù)參數(shù),在主調(diào)函數(shù)中可以得到多個(gè)變化了的值;使用指向數(shù)組的指針變量,可以大大提高執(zhí)行效率;使用指向字符串的指針變量構(gòu)成指針數(shù)組,在處理多個(gè)字符串時(shí),可以節(jié)省內(nèi)存空間,也可以提高程序的執(zhí)行效率;使用指向函數(shù)的指針作函數(shù)參數(shù),可以使一個(gè)通用函數(shù)實(shí)現(xiàn)專用功能;使用指向指針的指針變量,可以實(shí)現(xiàn)變量的二級(jí)尋址[5]。指針變量靈活的使用方式,往往讓初學(xué)者眩暈。但是從表4指針變量的表示形式這一列中發(fā)現(xiàn),所有指針變量具體應(yīng)用時(shí),都遵循規(guī)律:(1)先定義;(2)再賦值;(3)再引用。通過歸納和總結(jié),學(xué)生看到了變化中不變的性質(zhì),在具體應(yīng)用時(shí),才會(huì)以不變應(yīng)萬變,降低學(xué)習(xí)難度。
3.3注意語法細(xì)節(jié),勤于上機(jī)實(shí)踐
指針應(yīng)用靈活,值得注意的語法細(xì)節(jié)較多,如:p為一個(gè)指針變量,p++的含義,已不是簡(jiǎn)單的將p值加1,而是p+1*d,d=sizeof(p所指向的數(shù)據(jù)的數(shù)據(jù)類型)。這些細(xì)微之處直接影響學(xué)生實(shí)際分析程序,理解程序和編寫程序的能力。但是,過多拘泥于細(xì)節(jié),又會(huì)使學(xué)生感到枯燥無味。為了促進(jìn)學(xué)生正確掌握語法知識(shí),培養(yǎng)學(xué)生實(shí)際的編程能力,在整個(gè)教學(xué)過程中,上機(jī)實(shí)踐必不可少[6]。具體方案如下:
(1) 開設(shè)驗(yàn)證性實(shí)驗(yàn)。要求學(xué)生大量上機(jī),調(diào)試教材中現(xiàn)有的程序,弄清語法細(xì)節(jié),不斷積累經(jīng)驗(yàn)。
(2)開設(shè)設(shè)計(jì)性實(shí)驗(yàn)。教師根據(jù)學(xué)生的實(shí)際情況,指定上機(jī)題目,學(xué)生在課前設(shè)計(jì)算法、編寫程序,在上機(jī)課上對(duì)編寫的程序進(jìn)行調(diào)試、修改。整個(gè)實(shí)踐環(huán)節(jié),遵循循序漸進(jìn)的原則。教師應(yīng)該啟發(fā)學(xué)生,如:相同的問題能否采用不同的方法解決?用同一方法能否解決不同問題?等等,不斷拓寬和提高學(xué)生的編程思維。
總之,C語言是一門實(shí)踐性很強(qiáng)的課程,只有不斷上機(jī)摸索,才能熟練掌握并靈活應(yīng)用。
4總結(jié)
C語言是計(jì)算機(jī)專業(yè)和相關(guān)專業(yè)的一門重要基礎(chǔ)課程,指針是C語言的重點(diǎn),但是因其概念復(fù)雜、使用靈活,大多數(shù)學(xué)生難以掌握。在實(shí)際編程過程中,學(xué)生更容易出錯(cuò),而且錯(cuò)誤難以發(fā)現(xiàn)。這對(duì)教師的教學(xué)水平提出更高要求,教師不僅要對(duì)C語言指針有深刻理解,而且要有豐富的教學(xué)經(jīng)驗(yàn),激發(fā)學(xué)生的學(xué)習(xí)興趣。經(jīng)過多年教學(xué)實(shí)踐,本文總結(jié)出以上三種有效的教學(xué)方法。實(shí)踐證明:靈活運(yùn)用這些方法,將有效降低教學(xué)難度,并取得理想的教學(xué)效果。
參考文獻(xiàn):
[1] 譚浩強(qiáng). C語言程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2000.
[2] 王柏盛. C程序設(shè)計(jì)[M]. 北京:高等教育出版社,2004.
[3] 苗麗萍,安志紅. 現(xiàn)代認(rèn)知結(jié)構(gòu)論對(duì)教學(xué)的指導(dǎo)作用[J]. 佳木斯大學(xué)社會(huì)科學(xué)學(xué)報(bào),2004,(5).
[4] 李振濤. C語言多維數(shù)組與指針的探討[J]. 長(zhǎng)春師范學(xué)院學(xué)報(bào),2003,22(2):30.
[5] 李素萍. C語言指針的應(yīng)用[J]. 中國(guó)科技信息,2005,(21).
[6] 溫娟娟. C語言中指針的探討[J]. 河南職業(yè)技術(shù)師范學(xué)院學(xué)報(bào),2003,(9).