肖澤
(清遠(yuǎn)市技師學(xué)院,廣東 清遠(yuǎn) 511517)
C語言指針教學(xué)中定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)的作用及方法
肖澤
(清遠(yuǎn)市技師學(xué)院,廣東 清遠(yuǎn) 511517)
C語言指針教學(xué)一直是一個(gè)難點(diǎn),如何讓學(xué)生正確理解并掌握指針的定義及作用,是擺在所有教師面前的一道難題。特別是C語言中對(duì)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的定義,更加抽象化且難以理解,給教學(xué)工作帶來了較大的阻力。本文通過分析指針的基本概念,對(duì)指針中的變量進(jìn)行詳細(xì)說明,幫助學(xué)生理解各種運(yùn)算符號(hào),為定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)的教學(xué)提供了一些便捷。
C語言;指針教學(xué);復(fù)雜數(shù)據(jù)
指針的優(yōu)點(diǎn)之一就是可以定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu),使其簡(jiǎn)化、高效,便于使用。它不僅與數(shù)據(jù)的物理存儲(chǔ)緊密相關(guān),在其他程序中也有著非常廣泛的應(yīng)用,涉及的概念也十分復(fù)雜多樣,學(xué)生學(xué)習(xí)起來容易顯得力不從心。但是作為C語言的應(yīng)用核心,指針教學(xué)的質(zhì)量直接關(guān)系到學(xué)生對(duì)C語言的掌握程度。廣大教師一定要把它作為C語言課程教學(xué)的重點(diǎn)來進(jìn)行講授,這樣既能提高C語言的教學(xué)質(zhì)量,也可以為學(xué)生今后學(xué)習(xí)更加深?yuàn)W的計(jì)算機(jī)語言打下堅(jiān)實(shí)的基礎(chǔ)。
指針是存儲(chǔ)計(jì)算機(jī)內(nèi)存地址的變量,地址則是存儲(chǔ)單元中每個(gè)字節(jié)的唯一編號(hào)。舉例來說,如果在C語言中定義一個(gè)變量,那么程序在進(jìn)行編譯的時(shí)候就會(huì)給該變量分配若干字節(jié)的存儲(chǔ)空間,首個(gè)字節(jié)的編號(hào)就是該變量的地址;而這個(gè)地址,即首個(gè)字節(jié)的編號(hào),就是該變量的指針。如果在程序中專門用一個(gè)變量來存放另一個(gè)變量的指針,那么該變量又被稱為指針變量。通常在在教學(xué)中講述以上概念時(shí),會(huì)運(yùn)用一些比喻的手法來強(qiáng)化理論知識(shí)的形象,幫助學(xué)生理解這些概念。例如將學(xué)生宿舍樓比喻成計(jì)算機(jī)的存儲(chǔ)空間,其中每間宿舍都是一個(gè)存儲(chǔ)單元,學(xué)生相當(dāng)于存儲(chǔ)在其中的數(shù)據(jù),而房間號(hào)就是地址,那么房間號(hào)就是住在該宿舍中學(xué)生的指針。宿舍管理室則相當(dāng)于存儲(chǔ)指針的變量,對(duì)每間房間的號(hào)碼都進(jìn)行管理,那么宿舍管理室就是所有宿舍房間的指針變量。
設(shè)有三條C語句:int a,*p;a=7;p=&a;
第l條語句定義了整型變量a和指向整型的指針變量p,在C語言程序中,系統(tǒng)會(huì)根據(jù)該語句為a和p分配相應(yīng)的存儲(chǔ)空間;第2條語句是把整數(shù)7存儲(chǔ)到了變量a中;第3條語句是把變量a的地址存儲(chǔ)到變量p中;那么變量p就是變量a的指針變量。想要在系統(tǒng)中訪問變量a,查看其中存儲(chǔ)的內(nèi)容,可以通過兩種方法,一是直接訪問變量a,二是通過訪問指針變量p來間接訪問變量a。在教學(xué)時(shí),可以繼續(xù)運(yùn)用比喻的方法來解釋變量和指針變量的應(yīng)用,即直接訪問和間接訪問的過程。直接訪問即學(xué)生直接到相應(yīng)的房間內(nèi)找想要找的人,如同直接在系統(tǒng)中查找相應(yīng)數(shù)據(jù);間接訪問則是到宿舍管理室查詢所要找的房間號(hào)及學(xué)生名字,然后再去訪問對(duì)應(yīng)的房間和人。
3.1 定義基類型
在C語言中定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)的第一步是定義指針變量,而定義指針變量的第一步就是定義基類型。常見的指針變量是由基類型和指針變量名組成的,指針變量的賦值要與基類型相匹配,即指針變量是專門存放基類型的變量的地址。
以該c語句為例:float a;int*p;p=&a;p=3000;
后面兩條語句就是錯(cuò)誤的,因?yàn)樗鼈兣c定義指針變量的原則相悖,即沒有定義基類型。在語言編輯程序中設(shè)置這樣的規(guī)定是有意義的,如果指針變量能夠隨意指向未經(jīng)定義的基類型,就會(huì)引起內(nèi)存區(qū)域的不確定變化,進(jìn)而導(dǎo)致程序崩潰;其次,定義基類型能夠?yàn)橹羔樳\(yùn)算提供支持。在指針運(yùn)算的過程中,經(jīng)常需要移動(dòng)指針來處理連續(xù)的存儲(chǔ)對(duì)象,例如數(shù)組元素;如果沒有定義基類型,在處理這類數(shù)據(jù)時(shí)同樣會(huì)引發(fā)程序崩潰。同時(shí),指針的移動(dòng)就是對(duì)指針變量進(jìn)行加減運(yùn)算而得到的,如果定義基類型,就會(huì)使運(yùn)算更加簡(jiǎn)潔統(tǒng)一。例如在程序中給指針變量加l,實(shí)際上指針變量增加的值并不一定是1,而是一個(gè)整數(shù)n,這個(gè)n指代數(shù)據(jù)在內(nèi)存空間中所占用的字節(jié)數(shù);想要確定n的值,就要定義基類型,即指針變量所指向的數(shù)據(jù)類型。而基類型數(shù)據(jù)對(duì)象的字節(jié)數(shù),又被稱為指針變量的步長(zhǎng),在一些簡(jiǎn)單的運(yùn)算中能夠起到精簡(jiǎn)運(yùn)算的目的;如果指針變量是函數(shù)類型,則其步長(zhǎng)在運(yùn)算中沒有意義。
3.2 理解運(yùn)算符
C語言與指針有關(guān)的運(yùn)算符主要有&、*和[],它們分別代表地址運(yùn)算符、指針運(yùn)算符和下標(biāo)運(yùn)算符,其中*和[]只在表達(dá)式中起運(yùn)算符作用,在指針變量定義中只能起到說明作用,沒有運(yùn)算符的作用,通常在定義指針變量時(shí)要在變量名之前加*來區(qū)別于普通變量。教師在講解的過程中要把重點(diǎn)放在指針操作上,讓學(xué)生在實(shí)踐中理解運(yùn)算符的作用。需要注意的是,在起運(yùn)算符作用的時(shí)候,&和*互為逆運(yùn)算,[]和*之間的關(guān)系可以用表達(dá)式p[i]=*(p+i)來表示。盡管&和*代表了地址運(yùn)算符和指針運(yùn)算符,讓程序在運(yùn)算中獲取變量的地址及指針?biāo)赶虻淖兞?,但是在?shí)際操作中,這兩種運(yùn)算符還會(huì)引申出其他含義。
以如下語句為例,int c[3][4]={8,5,4,2,l,12,9,13,21,26,6,14};它定義了一個(gè)二維整型數(shù)組c,c是一個(gè)指針常量,也是該數(shù)組的數(shù)組名,代表數(shù)組c第0行的首個(gè)字節(jié)名稱,即常量地址,它指向的數(shù)據(jù)對(duì)象就是該二維數(shù)組的行。如果一個(gè)數(shù)組元素占用的字節(jié)數(shù)為2個(gè),那么該常量地址的步長(zhǎng)就是8。將運(yùn)算符&加到數(shù)組c前面,則表示無意義。因?yàn)閏是常量,它并沒有占用系統(tǒng)的內(nèi)存空間,自然就沒有地址;而運(yùn)算符&的含義是獲取地址,但是&c卻不能獲取到任何地址,自然也就無意義。如果在引申含義的層面上去理解&c,則有著不同的意義。通常認(rèn)為&的引申義是“使指針升級(jí)”,那么&c就不再是無意義,而是成為了一個(gè)指針常量,它指向的數(shù)據(jù)對(duì)象就是整個(gè)二維數(shù)組c,它還代表數(shù)組C的首個(gè)地址,其步長(zhǎng)為24。同樣的情況,*的引申義一般為“使指針降級(jí)”,*c也成為了一個(gè)指針常量,它指向的數(shù)據(jù)對(duì)象是該二維數(shù)組中的數(shù)組元素,它代表了數(shù)組C第0行第0列元素的地址,其步長(zhǎng)為2。
3.3 定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)
指針可以定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu),并說明復(fù)雜數(shù)據(jù)中所包含的各種對(duì)象,例如含有復(fù)雜元素的數(shù)組、復(fù)雜函數(shù)的指針等,從而滿足應(yīng)用程序在編寫過程中對(duì)復(fù)雜對(duì)象的簡(jiǎn)潔化描述,提高編寫效率。需要注意的是,*和[]只能在表達(dá)式中起運(yùn)算符的作用,這在前面也提到過,在指針定義中它們只是簡(jiǎn)單的指針標(biāo)志和數(shù)組標(biāo)志。而小括號(hào)()作為優(yōu)先級(jí)僅次于用戶標(biāo)識(shí)符的對(duì)象,也需要針對(duì)不同的情況對(duì)其含義進(jìn)行區(qū)分,有時(shí)它是函數(shù)標(biāo)志,有時(shí)則只是一般的括號(hào)運(yùn)算符。如果()挨著用戶標(biāo)識(shí)符,或者挨著一個(gè)被小括號(hào)括起來的字符串,那么它就是一個(gè)函數(shù)標(biāo)志;如果()內(nèi)部為空,或者為一個(gè)形參表列,那么它也是一個(gè)函數(shù)標(biāo)志,其他情況通常認(rèn)為是普通的括號(hào)運(yùn)算符。
定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)的實(shí)質(zhì)就是說明數(shù)據(jù)中每個(gè)部分的對(duì)象及其作用,一般都是從用戶標(biāo)識(shí)符開始,按照優(yōu)先級(jí)順序,從高到低依次為括號(hào)運(yùn)算符、函數(shù)標(biāo)志、指針標(biāo)志(即*)和數(shù)組標(biāo)志(即[])來逐個(gè)說明。以下面函數(shù)為例。
float(*x(int))[6];解釋要按照優(yōu)先級(jí)順序及其結(jié)合性順序,x(int):x是一個(gè)函數(shù),該函數(shù)包含了一個(gè)整型形參;(*x (int)):x是一個(gè)函數(shù),該函數(shù)包含了一個(gè)整型形參,其返回值為指針,即x是指針函數(shù);float(*x(int))[6]:x是一個(gè)函數(shù),該函數(shù)包含了一個(gè)整型形參,其返回值為指針,指向了包含6個(gè)元素的一維數(shù)組,該一維數(shù)組的每個(gè)元素都是一個(gè)實(shí)型變量。
通過該舉例可以看出,使用指針以后能夠極大地簡(jiǎn)化復(fù)雜的數(shù)據(jù)結(jié)構(gòu),讓函數(shù)的層次和順序十分鮮明易懂。作為比較,可以使用C語言中的typedef語句來定義該函數(shù),以便學(xué)生更好地理解其中的不同,其形式為:
{typedef float ARRAY[6];
typedef ARRAY*POINTERl;
POINTERl x(int);}
再有數(shù)組int(*f[6])(int,int);解釋同樣要按照順序,f[6]:f是一個(gè)數(shù)組,該數(shù)組包含了6個(gè)元素;(*f[6]):f是一個(gè)數(shù)組,該數(shù)組包含了6個(gè)元素,每個(gè)元素都是一個(gè)指針變量;int(*f [6])(int,int):f是一個(gè)數(shù)組,該數(shù)組包含了6個(gè)元素,每個(gè)元素都是一個(gè)指針變量,指向了一個(gè)函數(shù),該函數(shù)的原型為int函數(shù)名是(int,int)。
同樣用typedef語句來定義該數(shù)組,可以得到:
{typedef int(*POINTER2)(int,int);
POINTER2 f[6];}
指針是C語言中的精華,掌握了指針的定義和方法,能夠有效地簡(jiǎn)化復(fù)雜的數(shù)據(jù)結(jié)構(gòu),提高編寫的效率和正確率。但指針也是學(xué)好C語言的一道難關(guān),因?yàn)槠涓拍顝?fù)雜多變、使用方法靈活多樣,很多學(xué)生在學(xué)習(xí)的過程中容易產(chǎn)生畏難情緒。這就要求教師在教學(xué)中要根據(jù)由淺入深的原則,做好基礎(chǔ)知識(shí)點(diǎn)的講授,然后結(jié)合實(shí)踐范例,引入一些難點(diǎn)和重點(diǎn),并通過反復(fù)練習(xí)來達(dá)到熟練掌握的目的。本文所討論的關(guān)于指針的概念及定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)的方法,仍然十分淺顯,對(duì)于實(shí)際教學(xué)的幫助略顯不足。僅希望能夠起到一些拋磚引玉的作用,為今后的C語言指針教學(xué)積累一些有益的經(jīng)驗(yàn)。
[1]楊天明.C語言指針教學(xué)難點(diǎn)探析[J].中國(guó)科教創(chuàng)新導(dǎo)刊,2014 (8):137-138.
[2]吳斌.C語言指針的教學(xué)[J].安徽職業(yè)技術(shù)學(xué)院學(xué)報(bào),2004,3 (3):67-69.
The Function and Method of Complex Data Structures Definition in C Language Pointer Teaching
Xiao Ze
(Qingyuan City Technician Institute,Qingyuan 511517,Guangdong)
C language pointer teaching has always been difficult.It’s a difficult problem faced by the teachers that how to let students understand the definition and role of pointer correctly.Especially,the definition of complex data structures in C language is more abstract and difficult to understand,bring great resistance to the teaching work.This article analyzes the basic concept of pointer,and elaborates the variable of pointer in detail,helping students understand the operation symbols and providing convenient for the teaching of defining complex data structure.
C language;the pointer teaching;complex data
TP312-4;G642.4
A
1008-6609(2017)03-0067-02
肖澤(1980-),男,江西吉安人,本科,計(jì)算機(jī)一級(jí)實(shí)習(xí)指導(dǎo),研究方向?yàn)槁殬I(yè)教育。