韋純福李 波
(1.河南理工大學數(shù)學與信息科學學院,河南 焦作 454000;2.河南理工大學安全科學與工程學院,河南 焦作 454000)
C語言程序設(shè)計中的指針教學研究
韋純福1李 波2
(1.河南理工大學數(shù)學與信息科學學院,河南 焦作 454000;2.河南理工大學安全科學與工程學院,河南 焦作 454000)
指針是C語言程序設(shè)計的重要數(shù)據(jù)類型,亦是C語言的精華部分。但是,由于指針概念復(fù)雜,使用靈活,在實際的教學過程中學生常常感到難以理解。文章擬從指針的基本概念入手,分析函數(shù)指針、指針函數(shù)、數(shù)組指針及指針數(shù)組的區(qū)別與聯(lián)系,通過類比分析方法闡明該部分內(nèi)容,以期能夠幫助學生深入理解指針原理及其應(yīng)用。
C語言;指針數(shù)組;數(shù)組指針;函數(shù)指針;指針函數(shù)
C語言是一種面向過程的計算機高級語言且在國際上廣泛使用,其歷史悠久,發(fā)展相當迅速。指針是在C 語言程序設(shè)計中一個重要的概念,鑒于指針概念較復(fù)雜,使用方式多樣,學生通常感到難以理解掌握。因此,學習C語言時應(yīng)遵循序漸進的方法,從指針的概念入手,理解指針的內(nèi)涵,指針變量的定義與賦值方式,以及它與普通變量的差別與聯(lián)系。指針是C 語言程序設(shè)計學習的重點與難點之一,學生不能掌握指針該知識點,那么就很難學好C 語言。加之指針數(shù)據(jù)類型較多,書寫格式容易發(fā)生混淆。比如數(shù)組指針與指針數(shù)組,函數(shù)指針與指針函數(shù)等。這些容易發(fā)生混淆的概念與定義為學生理解指針帶來了極大的困難。學生若能熟練掌握指針、靈活運用指針,則可編寫出高效、緊湊、簡潔的程序。眾多教育工作者[1,2]對指針教學進行了積極的探索。本文基于譚浩強與賈宗璞等[3,4]研究者先期研究成果,從C語言的基本概念與定義出發(fā),結(jié)合學生學習過程中容易發(fā)生混淆的指針教學內(nèi)容,初步探索C語言教學中指針教學的相關(guān)問題,并把容易混淆的的指針教學知識點進行類比分析,以期對C語言的初學者有所幫助。
學生學習指針應(yīng)首先掌握其基本概念與定義?;诘刂返母拍钤傧?qū)W生介紹指針的定義,以幫助學生對指針的理解。如果告訴學生指針即地址、地址即指針,在程序的執(zhí)行過程中,變量、函數(shù)、數(shù)組等都存放在計算機的內(nèi)存單元中,內(nèi)存中的存儲單元都有對應(yīng)的地址,這樣更能幫助學生快速理解指針。需要向?qū)W生進一步闡述使用變量、數(shù)組、函數(shù)既可以直接訪問,又可以利用其存儲單元的地址進行間接地訪問,這種間接訪問便可以借助指針來完成的。學習指針復(fù)雜的使用形式之前,需要讓學生充分理解指針與變量。
2.1地址和指針的理解
依據(jù)馮.諾依曼提出的“存儲程序”的電子計算機的工作原理,數(shù)據(jù)與程序需要裝入內(nèi)存后方可進行處理。計算機內(nèi)存是以字節(jié)為基本單位的一片連續(xù)存儲區(qū)域,每個字節(jié)都有一個唯一的編號,該編號稱為內(nèi)存的“地址”。C語言提供了一種通過地址間接存取的方式,先用一種特殊的變量存放要訪問變量的地址,訪問時先從該特殊的變量中取出需要訪問變量的地址值,再依據(jù)該地址值去訪問對應(yīng)的存儲單元。由于地址就像要訪問存儲單元的指示標,于是形象地稱地址為指針,要訪問的存儲單元也形象地稱為“指針所指向的對象”。
2.2指針變量的理解
向?qū)W生介紹此部分內(nèi)容時,應(yīng)參照普通變量的定義形式,賦值方式,以便幫助學生快速地理解指針變量的定義及使用形式。指針變量也需要先定義后使用,其定義形式如下:
基類型 *指針變量名1,*指針變量名2,…;
定義中的“*”用來標示所定義的變量是一個指針變量,這里的“*”不能省略;“基類型”表示該指針變量所指向?qū)ο蟮臄?shù)據(jù)類型,其可以為任意數(shù)據(jù)類型。例如:
float *pa; /*pa是指向float型變量的指針變量*/
int *pb; /*pb是指向int型變量的指針變量*/
指針變量僅能指向預(yù)先定義時基類型所規(guī)定的類型變量,而不能指向規(guī)定之外的其他類型的變量。由于指針是內(nèi)存地址,指針變量只能用來存放指針。指針變量同普通變量一樣,同樣也具有普通變量的三要素:變量類型、變量名和變量值。
筆者在指針數(shù)組與數(shù)組指針的教學過程中,發(fā)現(xiàn)學生在理解這部分內(nèi)容時容易發(fā)生混淆。為此,通常將這兩部分內(nèi)容放在一起進行類比分析講解。
3.1指針數(shù)組
將指針數(shù)組和普通數(shù)組進行類比分析講解,不同在于普通數(shù)組元素是普通類型的數(shù)據(jù),而指針數(shù)組的元素都是指針。由此引出指針數(shù)組的定義,如果一個數(shù)組的元素值為指針,則稱這個數(shù)組為指針數(shù)組。指針數(shù)組各元素具有相同的基類型,是一組有序的指針的集合。指針數(shù)組的一般定義形式為:
類型標識符 *數(shù)組名[數(shù)組長度]
例如: float *pa[5];
表示定義了一個包含5個數(shù)組元素的指針數(shù)組pa,每個元素都是一個指向?qū)嵭妥兞康闹羔?。為了加深學生對指針數(shù)組的理解,下面列舉筆者在課堂教學過程中經(jīng)常用到的一個指針數(shù)組的例子及講解方法。
程序的運行結(jié)果為:
筆者講述此例題時,通常會預(yù)留幾分鐘時間給學生,讓學生先閱讀分析此程序的運行結(jié)果。然后與VC++編譯運行之后的結(jié)果相對照。筆者在進一步講解pa是一個指針數(shù)組,它的三個元素分別指向靜態(tài)二維數(shù)組a的三行等。
3.2數(shù)組指針
數(shù)組指針變量定義形式:
類型標識符 (*數(shù)組名)[數(shù)組長度]
例如: float (*pa)[5];
告訴學生在指針數(shù)組的基礎(chǔ)上,如果“*數(shù)組名”的兩邊加上括號,其意義則發(fā)生改變。方括號“[5]”前面(*pa)不是合法的標識符,由此判定(*pa)[5]不是數(shù)組。而定義中有*pa,則pa為指針變量,后面又有方括號“[5]”,即可判定是和數(shù)組有關(guān)的指針變量。它表示了一個指針變量pa, pa指向的對象是包含5個float型元素的一位數(shù)組。進一步通過算例讓學生明白其與指針數(shù)組的區(qū)別。
程序的運行結(jié)果為:
首先引導(dǎo)學生讀懂該程序,以兩種不同的方式輸出二維數(shù)組的元素,其中包括數(shù)組指針即指向二維數(shù)組行的指針。其次,將其與指針數(shù)組的例子進行對比分析,以加深學生對數(shù)組指針與指針數(shù)組的理解。
在指針教學過程中,除指針數(shù)組與數(shù)組指針之外,筆者發(fā)現(xiàn)函數(shù)指針與指針函數(shù)是學生又一對容易發(fā)生混淆的知識點。雖然字面意思相近,但是用法卻相距甚遠,為此,筆者經(jīng)常采用類比分析講解此部分內(nèi)容。
4.1函數(shù)指針
程序裝入內(nèi)存以后,每一個函數(shù)都要占用一段連續(xù)的內(nèi)存區(qū)域,而函數(shù)的名稱即是這段連續(xù)區(qū)域的首地址(又稱為函數(shù)的入口地址)。在C語言程序設(shè)計中,能夠把一個函數(shù)的首地址賦值給一個指針變量,使其指向該函數(shù),即可通過這個指針變量調(diào)用該函數(shù)。習慣上把這種指向函數(shù)的指針變量稱為“函數(shù)指針變量”,簡稱函數(shù)指針。函數(shù)指針變量的一般定義形式為:
類型標識符 (*指針變量名)(類型標識符1,類型標識符1…);
定義中的第一個“類型標識符”表示了被指函數(shù)返回值的類型,其余類型標識符用來說明所指向函數(shù)參數(shù)類型和參數(shù)個數(shù),通常括號內(nèi)的類型標識符要與所指函數(shù)參數(shù)類型相對應(yīng)。若所指向的函數(shù)沒有形式參數(shù),這一對圓括號也不可以省略。比如:
語句中的pa是一個指向函數(shù)的指針變量,其所指向的函數(shù)返回值必須為整型,且有兩個參數(shù),分別為整型和指向整型的指針。為進一步向?qū)W生闡述清楚函數(shù)指針的內(nèi)涵,筆者通常采用如下程序進行說明。
程序中 pmax是一個指針變量,指向返回值為整型的函數(shù),通過pmax調(diào)用max函數(shù),需要向?qū)W生闡明函數(shù)指針變量不能進行相應(yīng)的算術(shù)運算,這一點有別于數(shù)組指針不同,數(shù)組指針可以通過指針變量的加減進行移動,而函數(shù)指針的移動則無意義。提醒學生需要注意“*pmax”兩邊的括號不能省略,此處的“*”僅僅是一種指示符,不應(yīng)理解為指針運算符。
4.2指針函數(shù)
向?qū)W生闡明指針函數(shù)的字面意思,指針用來修飾函數(shù),該函數(shù)不同于普通函數(shù),如函數(shù)返回值為整型數(shù)據(jù)、實型數(shù)據(jù)的常稱為普通函數(shù)。進一步說明函數(shù)類型是指函數(shù)返回值的類型。C語言程序設(shè)計中允許一個函數(shù)的返回值為一個地址(即指針),并把這種返回指針值的函數(shù)稱作指針函數(shù)。指針函數(shù)的一般定義形式為:
定義中,函數(shù)名稱之前加了“*”,且無括號,表明該函數(shù)函數(shù)返回值是一個指針,即指針函數(shù)。其中類型標識符表示返回指針值的基類型。例如:
上述表示pf為指針函數(shù),其返回值的指針指向一個實型變量??赏ㄟ^如下程序進行進一步說明。
上述程序把兩個形式參數(shù)中較大的那個數(shù)的地址作為函數(shù)值返回。需要注意:函數(shù)指針與指針函數(shù)表示了兩種完全不同的含義。float *fun( )是一個函數(shù)聲明,fun表示一個指針函數(shù),其返回值是一個指向?qū)嵭蛿?shù)據(jù)的指針,“*fun”的兩邊沒有括號。而int (*pmax )( )則為一個變量聲明,表示pmax 是一個指向函數(shù)入口地址的指針變量,該函數(shù)返回值為整型數(shù)據(jù),“pmax”兩邊不能缺少圓括號。
根據(jù)C語言初學者在學習指針時常常遇到的難題以及容易發(fā)生混淆的概念,筆者分析總結(jié)了地址、指針、指針變量等的基本概念及區(qū)別與聯(lián)系;進一步類比分析了指針部分容易混淆的指針數(shù)組、數(shù)組指針、函數(shù)指針、指針函數(shù)等內(nèi)容,分別通過程序說明的他們的定義、使用形式及其區(qū)別。經(jīng)過分析與比較指針教學知識點之間的區(qū)別與聯(lián)系, 既能激發(fā)學生學習指針這部分內(nèi)容的動力,又能提高他們的自學C語言的能力。系統(tǒng)、靈活地掌握指針可以提高學生的編程能力,并且能夠提高他們學習C語言的自信心。經(jīng)過反復(fù)的教學實踐與總結(jié),筆者總結(jié)出的通過類比分析教學方法學習指針,能夠有效降低教學難度,達到了理想的教學效果。
[1] 趙忠孝,楊亞蕾.對C語言指針教學問題的探究[J].計算機教育,2009,(19):72-74.
[2] 李俊萩,趙家剛,張晴暉.C語言指針教學中的知識點分析與總結(jié)[J].計算機教育,2011,(8):55-60.
[3] 譚浩強.C語言程序設(shè)計[M].北京:清華大學出版社,2000.
[4] 賈宗璞,許合利.C語言程序設(shè)計[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-),男,河南理工大學數(shù)學與信息科學學院講師,博士,從事智能信息處理、礦山信息化的教學與研究工作。