正文 學習C語言中的指針類型(1 / 3)

摘要:結合我院學生十年來參加全國計算機等級考試(C語言部分)情況,通過分析成績分布與題型關係,我們發現指針方麵的題型失分率最高。在此基礎上結合教學實際,本文提出學習指針知識的方法和順序過程,並將其應用在C程序設計課程教學中,取得了較好的實踐效果。

關鍵詞:等級考試;指針;指針類型;指針常量;指針變量;數組與指針;行指針;列指針

據統計,十年來我院有450多名學生先後參加了全國計算機等級考試。我們對C語言筆試和上機成績分析發現,指針類型方麵的題型出錯率最高,占平均錯誤率的60%左右,這說明指針知識的學習是學生學習C語言的難點。指針類型是一種特別的數據類型,與C語言中其他數據類型相比,既抽象又複雜,同時有關C語言的教程類圖書對指針論述的差別也給學生帶來了困惑。根據筆者的經驗,學生隻有掌握了與指針類型相關的基礎知識,才能較好地理解、掌握和應用指針數據類型。

1計算機內存儲器地址的編碼方法

欲學好指針類型,首先要知道計算機內存儲器地址的編碼方法。計算機內存儲器裏存儲的信息都是由1和0構成的二進製數來表示,每一位二進製數位是表示信息的最小單位,計算機技術規定在內存儲器裏用八位二進製數位來存儲信息,這八位二進製數位叫一個字節,即在內存儲器裏是以字節為單位存儲信息的,如大寫英文字母A,在內存儲器裏用01000001表示。把能表示八位二進製數的存儲空間叫一個字節存儲單元。

在實模式下“為了訪問存儲器的不同字節存儲單元,每個字節存儲單元人為給以一個編號,叫存儲器的地址,地址從0開始編號,順序地每次加1。”如PC計算機配置512MB內存條,其存儲空間地址編號範圍用十六進製數表示為00000000~3FFFFFFF,即十進製數的範圍為:0~536870911,有536870912個字節存儲單元,相當於可存放536870912個英文字符(半角字符)。配置1G內存條,其存儲空間地址編號範圍用十六進製數表示為00000000~7FFFFFFF,即十進製數的範圍為:0~1073741823,有1073741824個字節存儲單元,相當於可存放1073741824個英文字符(半角字符)[1]。

2存儲單元的地址

C語言中數據有基本類型(字符型、整型、長整型、實型、枚舉型)、構造類型、指針類型等。不同數據類型在內存中存儲時,占用的字節數不同,如字符型需要1個字節空間,整型需要2個字節空間,長整型需要4個字節空間等。把不同數據類型存儲時需要的N個字節看成一個整體,叫一個存儲單元。對字符型N=1,整型N=2,長整型N=4等。對1個字節構成的存儲單元,其字節單元地址編號就是該存儲單元的地址,對多個(N>=2)字節構成的存儲單元,其低字節單元地址為該存儲單元的地址,也叫存儲單元的首地址[1-2]。

3指針類型

語言中的指針類型有指針常量和指針變量。指針常量簡稱為指針,即存儲單元的地址。可以認為配置不同容量的內存,其指針值的範圍是不同的,但都是

作者簡介:楊加義(1960-),男,高級講師,研究方向為嵌入式係統、Matlab仿真技術、Matlab語言與學科教學。

從0起始的。每個存儲單元的指針值都是固定不變的。指針變量就是用來存放指針的變量。指針變量是一種較特別的變量,它的值是一些特定的整數值,不是任何整數(如負整數)都可以存放到指針變量,指針變量與整數加減運算也不同於數學中的運算方法。指針變量也有自己的內存空間,空間的大小由編譯器決定,在Turbo C 2.0下是2個字節,在Visual VC++下是4個字節[1,3]。

4變量的指針

在編譯C語言程序時,要在內存為各種變量分配相應的存儲單元,相應的變量名稱對應著存儲單元的首地址,這首地址就是變量的指針。可以將一變量的指針賦給一指針變量(存到指針變量代表的存儲單元中),這時就說指針變量指向了該變量(也可以說指針變量指向了該變量表示的存儲單元)。對存儲單元的存取操作即可以用變量名,也可以通過指向該變量的指針變量來進行,這要用到指針運算符“*”[3]。

5指針變量類型和它所指向的數據類型

指針變量的類型以聲明它時其前麵的“*”為標誌,無論指針變量指向何種數據類型,它所占用的內存空間大小是一定的(如2個字節),這與其他數據類型的變量所占有的內存空間大小一定一樣,所以指針變量的類型就是指針類型,與它所指向的數據類型無關。有資料把可指向不同數據類型的指針變量說成有整型指針(int *)變量、實型指針(float *)變量、字符型指針(char *)變量等,筆者覺得沒必要。如果非要這樣說,理解成指針變量可指向什麼數據類型變量就叫什麼數據類型指針變量為好,如 int *p;的聲明p可以指向整型變量,說p是整型指針變量為好。

聲明指針變量時,還要聲明允許指針變量指向的數據類型,這由聲明指針變量時“*”前麵的“基類型”決定。指針類型加減整數運算時移動的位置大小由指向的數據類型來決定。指向同一種數據類型的不同指針變量間可以進行加減或大小比較運算,指向不同數據類型的指針變量不能進行加減運算或大小比較運算。指針變量一旦被“基類型”聲明可指向某種數據類型,就不能再指向其他別的數據類型。