韋純福李 波
(1.河南理工大學數學與信息科學學院,河南 焦作 454000;2.河南理工大學安全科學與工程學院,河南 焦作 454000)
C語言程序設計中的指針教學研究
韋純福1李 波2
(1.河南理工大學數學與信息科學學院,河南 焦作 454000;2.河南理工大學安全科學與工程學院,河南 焦作 454000)
指針是C語言程序設計的重要數據類型,亦是C語言的精華部分。但是,由于指針概念復雜,使用靈活,在實際的教學過程中學生常常感到難以理解。文章擬從指針的基本概念入手,分析函數指針、指針函數、數組指針及指針數組的區別與聯系,通過類比分析方法闡明該部分內容,以期能夠幫助學生深入理解指針原理及其應用。
C語言;指針數組;數組指針;函數指針;指針函數
C語言是一種面向過程的計算機高級語言且在國際上廣泛使用,其歷史悠久,發展相當迅速。指針是在C 語言程序設計中一個重要的概念,鑒于指針概念較復雜,使用方式多樣,學生通常感到難以理解掌握。因此,學習C語言時應遵循序漸進的方法,從指針的概念入手,理解指針的內涵,指針變量的定義與賦值方式,以及它與普通變量的差別與聯系。指針是C 語言程序設計學習的重點與難點之一,學生不能掌握指針該知識點,那么就很難學好C 語言。加之指針數據類型較多,書寫格式容易發生混淆。比如數組指針與指針數組,函數指針與指針函數等。這些容易發生混淆的概念與定義為學生理解指針帶來了極大的困難。學生若能熟練掌握指針、靈活運用指針,則可編寫出高效、緊湊、簡潔的程序。眾多教育工作者[1,2]對指針教學進行了積極的探索。本文基于譚浩強與賈宗璞等[3,4]研究者先期研究成果,從C語言的基本概念與定義出發,結合學生學習過程中容易發生混淆的指針教學內容,初步探索C語言教學中指針教學的相關問題,并把容易混淆的的指針教學知識點進行類比分析,以期對C語言的初學者有所幫助。
學生學習指針應首先掌握其基本概念與定義。基于地址的概念再向學生介紹指針的定義,以幫助學生對指針的理解。如果告訴學生指針即地址、地址即指針,在程序的執行過程中,變量、函數、數組等都存放在計算機的內存單元中,內存中的存儲單元都有對應的地址,這樣更能幫助學生快速理解指針。需要向學生進一步闡述使用變量、數組、函數既可以直接訪問,又可以利用其存儲單元的地址進行間接地訪問,這種間接訪問便可以借助指針來完成的。學習指針復雜的使用形式之前,需要讓學生充分理解指針與變量。
2.1地址和指針的理解
依據馮.諾依曼提出的“存儲程序”的電子計算機的工作原理,數據與程序需要裝入內存后方可進行處理。計算機內存是以字節為基本單位的一片連續存儲區域,每個字節都有一個唯一的編號,該編號稱為內存的“地址”。C語言提供了一種通過地址間接存取的方式,先用一種特殊的變量存放要訪問變量的地址,訪問時先從該特殊的變量中取出需要訪問變量的地址值,再依據該地址值去訪問對應的存儲單元。由于地址就像要訪問存儲單元的指示標,于是形象地稱地址為指針,要訪問的存儲單元也形象地稱為“指針所指向的對象”。
2.2指針變量的理解
向學生介紹此部分內容時,應參照普通變量的定義形式,賦值方式,以便幫助學生快速地理解指針變量的定義及使用形式。指針變量也需要先定義后使用,其定義形式如下:
基類型 *指針變量名1,*指針變量名2,…;
定義中的“*”用來標示所定義的變量是一個指針變量,這里的“*”不能省略;“基類型”表示該指針變量所指向對象的數據類型,其可以為任意數據類型。例如:
float *pa; /*pa是指向float型變量的指針變量*/
int *pb; /*pb是指向int型變量的指針變量*/
指針變量僅能指向預先定義時基類型所規定的類型變量,而不能指向規定之外的其他類型的變量。由于指針是內存地址,指針變量只能用來存放指針。指針變量同普通變量一樣,同樣也具有普通變量的三要素:變量類型、變量名和變量值。
筆者在指針數組與數組指針的教學過程中,發現學生在理解這部分內容時容易發生混淆。為此,通常將這兩部分內容放在一起進行類比分析講解。
3.1指針數組
將指針數組和普通數組進行類比分析講解,不同在于普通數組元素是普通類型的數據,而指針數組的元素都是指針。由此引出指針數組的定義,如果一個數組的元素值為指針,則稱這個數組為指針數組。指針數組各元素具有相同的基類型,是一組有序的指針的集合。指針數組的一般定義形式為:
類型標識符 *數組名[數組長度]
例如: float *pa[5];
表示定義了一個包含5個數組元素的指針數組pa,每個元素都是一個指向實型變量的指針。為了加深學生對指針數組的理解,下面列舉筆者在課堂教學過程中經常用到的一個指針數組的例子及講解方法。

程序的運行結果為:

筆者講述此例題時,通常會預留幾分鐘時間給學生,讓學生先閱讀分析此程序的運行結果。然后與VC++編譯運行之后的結果相對照。筆者在進一步講解pa是一個指針數組,它的三個元素分別指向靜態二維數組a的三行等。
3.2數組指針
數組指針變量定義形式:
類型標識符 (*數組名)[數組長度]
例如: float (*pa)[5];
告訴學生在指針數組的基礎上,如果“*數組名”的兩邊加上括號,其意義則發生改變。方括號“[5]”前面(*pa)不是合法的標識符,由此判定(*pa)[5]不是數組。而定義中有*pa,則pa為指針變量,后面又有方括號“[5]”,即可判定是和數組有關的指針變量。它表示了一個指針變量pa, pa指向的對象是包含5個float型元素的一位數組。進一步通過算例讓學生明白其與指針數組的區別。

程序的運行結果為:

首先引導學生讀懂該程序,以兩種不同的方式輸出二維數組的元素,其中包括數組指針即指向二維數組行的指針。其次,將其與指針數組的例子進行對比分析,以加深學生對數組指針與指針數組的理解。
在指針教學過程中,除指針數組與數組指針之外,筆者發現函數指針與指針函數是學生又一對容易發生混淆的知識點。雖然字面意思相近,但是用法卻相距甚遠,為此,筆者經常采用類比分析講解此部分內容。
4.1函數指針
程序裝入內存以后,每一個函數都要占用一段連續的內存區域,而函數的名稱即是這段連續區域的首地址(又稱為函數的入口地址)。在C語言程序設計中,能夠把一個函數的首地址賦值給一個指針變量,使其指向該函數,即可通過這個指針變量調用該函數。習慣上把這種指向函數的指針變量稱為“函數指針變量”,簡稱函數指針。函數指針變量的一般定義形式為:
類型標識符 (*指針變量名)(類型標識符1,類型標識符1…);
定義中的第一個“類型標識符”表示了被指函數返回值的類型,其余類型標識符用來說明所指向函數參數類型和參數個數,通常括號內的類型標識符要與所指函數參數類型相對應。若所指向的函數沒有形式參數,這一對圓括號也不可以省略。比如:

語句中的pa是一個指向函數的指針變量,其所指向的函數返回值必須為整型,且有兩個參數,分別為整型和指向整型的指針。為進一步向學生闡述清楚函數指針的內涵,筆者通常采用如下程序進行說明。

程序中 pmax是一個指針變量,指向返回值為整型的函數,通過pmax調用max函數,需要向學生闡明函數指針變量不能進行相應的算術運算,這一點有別于數組指針不同,數組指針可以通過指針變量的加減進行移動,而函數指針的移動則無意義。提醒學生需要注意“*pmax”兩邊的括號不能省略,此處的“*”僅僅是一種指示符,不應理解為指針運算符。
4.2指針函數
向學生闡明指針函數的字面意思,指針用來修飾函數,該函數不同于普通函數,如函數返回值為整型數據、實型數據的常稱為普通函數。進一步說明函數類型是指函數返回值的類型。C語言程序設計中允許一個函數的返回值為一個地址(即指針),并把這種返回指針值的函數稱作指針函數。指針函數的一般定義形式為:

定義中,函數名稱之前加了“*”,且無括號,表明該函數函數返回值是一個指針,即指針函數。其中類型標識符表示返回指針值的基類型。例如:


上述表示pf為指針函數,其返回值的指針指向一個實型變量。可通過如下程序進行進一步說明。

上述程序把兩個形式參數中較大的那個數的地址作為函數值返回。需要注意:函數指針與指針函數表示了兩種完全不同的含義。float *fun( )是一個函數聲明,fun表示一個指針函數,其返回值是一個指向實型數據的指針,“*fun”的兩邊沒有括號。而int (*pmax )( )則為一個變量聲明,表示pmax 是一個指向函數入口地址的指針變量,該函數返回值為整型數據,“pmax”兩邊不能缺少圓括號。
根據C語言初學者在學習指針時常常遇到的難題以及容易發生混淆的概念,筆者分析總結了地址、指針、指針變量等的基本概念及區別與聯系;進一步類比分析了指針部分容易混淆的指針數組、數組指針、函數指針、指針函數等內容,分別通過程序說明的他們的定義、使用形式及其區別。經過分析與比較指針教學知識點之間的區別與聯系, 既能激發學生學習指針這部分內容的動力,又能提高他們的自學C語言的能力。系統、靈活地掌握指針可以提高學生的編程能力,并且能夠提高他們學習C語言的自信心。經過反復的教學實踐與總結,筆者總結出的通過類比分析教學方法學習指針,能夠有效降低教學難度,達到了理想的教學效果。
[1] 趙忠孝,楊亞蕾.對C語言指針教學問題的探究[J].計算機教育,2009,(19):72-74.
[2] 李俊萩,趙家剛,張晴暉.C語言指針教學中的知識點分析與總結[J].計算機教育,2011,(8):55-60.
[3] 譚浩強.C語言程序設計[M].北京:清華大學出版社,2000.
[4] 賈宗璞,許合利.C語言程序設計[M].北京:人民郵電出版社,2011.
Research on pointer teaching of C language
Pointer is an important data type of C language programming and is also the essence. College students often feel difficult to understand pointer in the actual teaching process, because of complex concept and flexible use of pointer. Distinction and connection among pointer array and array pointer, function pointer and pointer function will be studied based on basic concepts of pointer, they will be clarified by analogy analysis method, in order to help students understand the principle and application of pointer.
C language;pointer array;array pointer;function pointer;pointer function
G64
A
1008-1151(2015)07-0136-03
2015-06-10
韋純福(1979-),男,河南理工大學數學與信息科學學院講師,博士,從事智能信息處理、礦山信息化的教學與研究工作。