摘要:分析指針的基本概念及指針在數組、函數、字符串、動態存儲分配等方面的應用,提出指針教學過程中易混淆概念及注意事項,對初學者深入理解指針原理及應用有重要的指導意義。
關鍵詞:指針;地址;數組;字符串;函數;動態存儲分配
C語言是一門重要的計算機基礎課程,指針是C語言的精華。而指針應用范圍廣、使用靈活等特點時常讓初學者感到困惑。利用指針可以訪問各種類型的數據,能夠實現動態存儲分配,提高編程效率,加深對數據存儲方式的理解。本文從指針的基本概念,指針在數組、函數、字符串、動態存儲分配等方面的應用入手,剖析指針與各部分基礎知識相結合時的教學重點和難點。利用對比的方法指出初學者在學習指針過程中易混的概念及注意事項,有利于初學者對指針的理解和掌握。
1指針基本概念的理解
指針學習首先應掌握其基本概念。指針即地址、地址即指針。程序運行過程中,變量、數組、函數等都存放在內存的存儲單元中,每個存儲單元都有地址。使用變量、數組、函數既可以直接訪問,又可以利用其存儲單元地址進行間接訪問,這種間接訪問便是借助指針來完成的。
1.1對指針類型的理解
理解指針概念要從指針類型入手,教師在教學中應著重講述指針類型的含義,以及與普通變量類型的區別。指針定義時的類型稱為指針的基礎類型,理解上應區別于普通變量的類型。如定義:
由上表可以看出,普通變量的數據類型決定了其占用內存單元的字節數以及存放數值的范圍。而指針變量不論其基礎類型為何種類型,均占用4個字節的存儲空間。并且指針變量與普通變量最大的區別在于,指針變量存地址值,而普通變量存數值。
1.2指針運算符的理解
1.2.1對取地址符“&”的理解
指針變量定義后應為其賦一個有效地址值,讓它指向有效的存儲空間。未賦值的指針變量稱為“懸空”指針,使用懸空指針非常危險,可能會導致系統崩潰。為指針變量賦值時常要用到取地址運算符“&”。令初學者常常感到困惑的是分不清賦值號左右兩側的數據類型是否匹配。圖1所示為指針變量正確的賦值關系。
1.2.2對取內容符“*”的理解
取內容符“*”又稱間接運算符。當指針指向某存儲單元后,利用指針訪問該存儲單元的內容便要用到取內容符。為幫助初學者更好的理解取內容符,在教學過程中應著重強調以下幾個易混淆概念。
1) 取內容符不是取指針變量自己的內容,而是取指針變量所指存儲單元里的內容。
2) 應區分取內容符和指針變量定義時的星號。前者是一個運算符,后者僅僅是一個標志。
3)“取內容”運算與“取地址”運算互為反向運算。取內容符“*”可以放在一級指針變量或者二級指針變量前面,但是不可以放在普通變量前面。對于取內容運算有以下關系:
* 二級指針 一級地址
* 一級指針 數值
1.2.3對指針加、減運算的理解
對指針變量加減運算的學習應區別于普通變量的加減運算。指針的加減運算是控制指針前移或后移,其移動的具體字節數由指針的基礎類型決定。
如定義:char *p1;int *p2;double *p3;
則p1++、p2++、p3++均表示三個指針向后移動了一個單元。但由于p1、p2、p3的基礎類型不同,決定了它們移動的字節數有所區別,p1指針后移了1個字節,p2指針后移了4個字節,p3指針后移了8個字節。
2指針與數組的關系及應用
由于數組元素在內存中連續存放,因此利用指針對數組操作是非常方便的,只需控制指針前移或者后移便可以指向不同的數組元素。
2.1指針與一維數組
指針與數組這部分學習的難點在于:1)如何表示數組中某個元素的地址;2)如何將指針指向數組中的指定元素;3)如何使用“下標法”或“指針法”引用數組元素。
引用一維數組元素及其地址的方法有以下兩種——“下標法”和“指針法”[1]。如表2、表3所示。在教學中,應注意比較這兩種方法。如定義:
int a[4]