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