}
銀幕上顯示的結果是:
12,12,12,12
13,13,13,13
14,14,14,14
15,15,15,15
16,16,16,16
當上面的程序運行結束之后,老師面向學生分析上述程序:
該程序的前三條語句“p=a; q=p; r=q;”,其功能對應下面的示意圖:
變量a是一個已經初始化或者賦值的整形變量,語句“p=a;”規定了一重指針變量p指向變量a;語句“q=p”規定了二重指針變量q經過一重指針變量p指向變量a;語句“r=q;”規定了三重指針變量連續經過兩個指針變量q和p而指向變量a。四條語句“a=13; *p=14;**q=15;和***r=16;”的功能都是對同一個變量a賦值,以上程序運行結果也驗證了這一點。
老師還應指出:三條語句“p=a; q=p; r=q;”是有序的,是由p、q、r的定義所規定的,不可顛倒順序,也不能“越級”,譬如“*q=a;”或者“q=a;”都是錯誤的,當然“**r=a”或者“*r=p”也是錯的。另外,“(a)”總是錯的,因為符號“”是取變量的地址,而地址,譬如a,是“值”而不是變量,所以 “(a)”無意義。
老師還應強調指出:此例中的int可用float、double或者char代換,其程序和結論相同,但應該注意的是,當用類型char代換int之后,給變量賦值時可賦字符形的,也可賦整形的。
最后,老師可以補充:此例中的變量a,也可以是數組元素,因為一個數組元素等價一個變量,只是命名規則不同而已。
2、多重指針與字符串(或者字符數組)的關系
這一步驟是為介紹“指針數組和多重指針”做準備,同時也是為了拓寬多重指針的應用范圍。
在討論“多重指針與字符串(或者字符數組)的關系”之前,老師應強調:在C++/C語言里,字符串有其特殊的操作規則,特別是將一個字符串常量賦給一個字符指針或者輸入到一個字符數組時,該指針或者數組名接收該字符串首字符的地址,而不是接收字符串本身,將字符串和多重指針結合時更要注意這一點。另外,要輸出整個字符串,只需將該字符串的首字符地址置入輸出語句即可。
老師將下列程序輸入系統并運行,將結果輸出到銀幕上:
void main()
{ char *bb=\"1234512345\",**qq,***rr;
qq=bb;
rr=qq;
cout<bb=\"dfDDDDDDf\";
cout<*qq=\"jhhjhbjhjhb\";
cout<**rr=\"mmmmmm\";
cout<}
銀幕上顯示的結果是:
1234512345,1234512345,1234512345
dfDDDDDDf,dfDDDDDDf,dfDDDDDDf
jhhjhbjhjhb,jhhjhbjhjhb,jhhjhbjhjhb
mmmmmm,mmmmmm,mmmmmm
當上面的程序運行結束之后,老師面向學生分析上述程序:
變量bb,qq以及rr的順序關系和上例類似,即兩條語句“qq=bb; rr=qq;”順序不可顛倒。同時,變量rr通過qq指向bb,qq直接指向bb,以上的程序運行結果也驗證了這一點。另外,老師應提醒學生注意語句“cout”,其中列出的是存儲有字符串首字符地址的指針。
3、多重指針與字符串數組的關系
在這里,老師應指出:上面的例子表明存儲字符串的數組應該是指針數組,其中的每一個元素,相當一個指針變量,記錄對應字符串的地址。
老師將下面的程序輸入系統并運行,將結果輸出到銀幕上:
void main()
{char *cc[5]={\"abc\",\"defg\",\"89kp\"},**qqq,***rrr; int u=2;
qqq=cc[u];
rrr=qqq;
cout<cc[u]=\"kkkkk\";
cout<*qqq=\"LLLLLLL\";
cout<**rrr=\"RRRRRRR\";
cout<}
上面程序運行的結果是:
89kp,89kp,89kp
Kkkkk,kkkkk,kkkkk
LLLLLLL,LLLLLLL,LLLLLLL
RRRRRRR,RRRRRRR,RRRRRRR
到此,老師面對學生應做如下分析:語句char *cc[5]={\"abc\",\"defg\",\"89kp\"}定義了一個指針數組,含5個元素,并且給數組cc做了初始化。這里,數組中的5個元素分別指向不同的字符串,譬如元素cc[2]指向字符串“89kp”。類比以上的例子,我們可以用多重指針指向數組中的各個字符串。在這個例子中,我們用多重指針變量qqq和rrr指向字符串cc[u],qqq直接指向cc[u], 而rrr通過qqq指向cc[u]。
4、總結
講完以上內容之后,老師應組織學生簡單回顧以上的三個例子,并且歸納出結論:任何類型的變量,包括指針變量,都對應一個內存單元,我們均可以依照C++/C語法用指針變量或者多重指針變量指向它們。
(六)教學效果分析
就一般情形而言,引進多重指針主要是為了方便訪問指針數組中的元素,譬如輸入和輸出。具體地說,我們主要讓學生理解并掌握上述的第三個例子。但是在第三個例子中,含字符串、數組及指針等三個重要概念。這三個重要概念,特別是第一和第三個,都是教學難點,如果將它們放在一起討論,無疑提高了學生的理解難度。如果我們直接講解第三個例子,學生只能機械地記憶該例子而不是真正的理解。在這里,我們先引入例(1),將多重指針的概念和變量聯系在一起,而其中的單重指針和變量的關系在引入指針概念時學生已經學過。學生有了指針的概念,將“單重指針和變量的關系”過渡到“多重指針和變量的關系”,其難度應該不會太大。在這個例子中,學生了解了多重指針指向變量的概念及其初步應用。當我們引入第二個例子時,學生對其中的問題有了“似曾相識”之感,只要老師引導學生對字符串的概念加以簡單回顧,學生就可以容易理解該例子并初步掌握多重指針的概念。到了例子(3),老師應強調:“例子(3)和例子(2)類似,不同之處在于:例(2)處理單個字符串,而例(3)處理一組字符串,從本質上說兩例幾乎沒有區別”。通過老師的強調和分析,學生就容易理解例(3)了。到此,學生應該理解和掌握多重指針的概念了,預計的教學目的達到。
二、關于本課堂教學設計的實踐
本文提出的教學設計,是經過多年的教學經歷后提出來的。早期,和教材一致,一開始就舉例子講解二重指針與指針數組的關系。課堂上,學生也能夠積極參與,但在考試時無法解答多重指針問題。應用本設計教學以后,大部分學生對多重指針都能夠理解,面對相關問題時有了信心。
三、結論
本文基于實際情況而設計的“C++/C多重指針課堂教學”,體現了“先易后難”、“循序漸進”等教學原則。在教學實踐中,可結合啟發式教學法實施該教學設計,將會取得預期的教學效果,達到預期的教學目的。
參考文獻:
[1]譚浩強.C++程序設計[M].第一版.北京,清華大學出版社,2004.6
[2]韓海.關于二級指針的進一步討論[J].江漢大學學報,Vol.33, No.1, pp.42-44, Mar., 2005
[3]秦玉平,馬靖善.“C語言程序設計”課程教材建設與教學方法研究[J].計算機教育,No。4,pp.157-160,2010.2.25
[4]楊艷梅,劉心軍.C語言程序設計教學探討[J].信息與電腦,2011.2,pp111
[5]張偉宏.“C語言程序設計”教學方法探討[J].科技文匯,下旬刊,pp.95-96. 2009.11