亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        C語(yǔ)言指針教學(xué)難點(diǎn)透析

        2017-02-25 07:10:08張憶文
        計(jì)算機(jī)教育 2017年1期
        關(guān)鍵詞:數(shù)組指針指向

        張憶文

        (華僑大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,福建 廈門 361021)

        C語(yǔ)言指針教學(xué)難點(diǎn)透析

        張憶文

        (華僑大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,福建 廈門 361021)

        指針既是C語(yǔ)言的重點(diǎn),又是教學(xué)難點(diǎn)。文章從指針的基本概念入手,由淺入深地討論指針教學(xué)的重點(diǎn)與難點(diǎn),重點(diǎn)介紹指向數(shù)組元素的指針、指向數(shù)組的指針、指針數(shù)組、指針函數(shù)以及函數(shù)指針變量等容易混淆的概念,通過(guò)應(yīng)用實(shí)例揭示它們之間的區(qū)別,進(jìn)而闡釋指針的實(shí)質(zhì)。

        C語(yǔ)言;指針;函數(shù);數(shù)組

        0 引 言

        C語(yǔ)言程序設(shè)計(jì)在計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言中占有重要的一席之地,它以語(yǔ)法簡(jiǎn)潔緊湊、程序精煉、運(yùn)算符和數(shù)據(jù)結(jié)構(gòu)豐富、編程靈活、可移植性好而著稱[1]。然而由于教科書內(nèi)容僵化、過(guò)于抽象,且授課的對(duì)象往往是大學(xué)低年級(jí)學(xué)生,造成某些知識(shí)點(diǎn)難以理解,甚至理解錯(cuò)誤。其中,C語(yǔ)言指針教學(xué)就是公認(rèn)的教學(xué)難點(diǎn)[2],因?yàn)橹羔樖荂語(yǔ)言的一大特色,用途極其廣泛,所以,如何讓學(xué)生透徹地理解指針,避免在使用過(guò)程中不犯錯(cuò)誤或者少犯錯(cuò)誤,是C語(yǔ)言教學(xué)中的一個(gè)重要問(wèn)題。

        1 指針的基本概念

        1.1 指針變量的定義

        所謂指針是指變量在內(nèi)存中的地址,是一個(gè)常量,其實(shí)質(zhì)是對(duì)地址的操作實(shí)現(xiàn)對(duì)數(shù)據(jù)的操作?!?”和“*”是指針的兩個(gè)最基本的運(yùn)算符?!?”是取地址運(yùn)算符,也就是將變量在內(nèi)存的地址取出來(lái),其結(jié)合性為自右向左?!?”是取內(nèi)容運(yùn)算符,也就是將指針變量所指向變量的值取出,其結(jié)合性為自左向右。用來(lái)存放指針(地址)的變量成為指針變量。其定義如下:

        類型標(biāo)識(shí)符 *指針變量名表;

        例如:

        void main( ){

        (1) int i=20;

        (2) int *p;

        (3) p=&i;

        (4) printf(“i address is %x p address is %x *p=%d”,&i,&p,*p);}

        語(yǔ)句(2)定義了指針變量p,語(yǔ)句(3)對(duì)指針變量p進(jìn)行初始化,使它指向普通變量i。注意到語(yǔ)句(2)指針定義中的“*”不是指針運(yùn)算符,不進(jìn)行任何運(yùn)算,它僅僅是標(biāo)志所定義的變量為指針變量。運(yùn)行程序可知, i address is 0018FF44,p address is 0018FF40,*p=20。普通變量i和指針變量p的關(guān)系如圖1所示。

        圖1 普通變量i與指針變量p

        從圖1可以看出指針變量p的值為普通變量i的地址,也就是說(shuō)指針變量p指向了普通變量i。普通變量i的值為20。指針變量和普通變量都是變量,其在內(nèi)存中都占據(jù)一定的空間,例如:指針變量p在內(nèi)存的地址為0018FF40,而普通變量i在內(nèi)存的地址為0018FF44。指針變量與普通變量的最大區(qū)別就是:指針變量所存儲(chǔ)的內(nèi)容是其他變量地址,而普通變量所存儲(chǔ)的內(nèi)容是值。

        1.2 指針變量的引用

        指針變量的使用要注意以下幾點(diǎn):

        (1) 必須先定義,后使用。

        (2)對(duì)指針變量的操作,其類型要一致。例如int i=50;char *p=&i;這個(gè)操作就是非法的,因?yàn)槠胀ㄗ兞縤其類型是整形,而指針變量p其類型為字符型,這兩個(gè)變量的類型不匹配。

        (3)不能將數(shù)值直接賦值給指針變量,例如int *p=62353;這個(gè)語(yǔ)句也是非法的,因?yàn)橹羔樧兞恐荒艽鎯?chǔ)其他變量的地址。

        (4)指針變量在使用之前必須對(duì)其進(jìn)行初始化,例如 int *p;printf(“*p is %d”);這個(gè)操作是非法的,因?yàn)闆]有對(duì)指針變量進(jìn)行初始化,也就是說(shuō)指針變量沒有所指。

        (5)指針變量可以進(jìn)行算術(shù)運(yùn)算,例如 int a[5]={0,1,2,3,4}; int *p=a; p+3;語(yǔ)句p+3不是指針變量p的值簡(jiǎn)單加3,而是使指針變量p指向a[3],假設(shè)一個(gè)int占用4個(gè)字節(jié)(不同的編譯器,所占用的字節(jié)不一樣),p+3相當(dāng)于移動(dòng)了12個(gè)字節(jié)。

        (6)注意const int *p;int const *p; const int const *p;三者的區(qū)別。const int *p表示值不變地址可變,也就是說(shuō)不能利用指針變量p對(duì)其所指向的對(duì)象的值進(jìn)行修改,但指針變量p可以指向同類型的其他變量。int const *p表示地址不變,值可變,也就是說(shuō)可以利用指針變量p對(duì)其所指向的對(duì)象的值進(jìn)行修改,但指針變量p不能指向同類型的其他變量。const int const *p表示值不變,地址也不變,也就是說(shuō)不能利用指針變量p對(duì)其所指向的對(duì)象的值進(jìn)行修改,也不能使指針變量p指向同類型的其他變量。

        2 指針與數(shù)組

        數(shù)組是C語(yǔ)言中的一個(gè)重要構(gòu)造類型,是具有相同數(shù)據(jù)類型的有序數(shù)據(jù)集合。數(shù)組中的每個(gè)元素都在內(nèi)存中占用存儲(chǔ)單元,且每個(gè)存儲(chǔ)單元占據(jù)的存儲(chǔ)空間都是相同的。數(shù)組名代表數(shù)組元素的首地址,可以將其直接賦值給相同數(shù)據(jù)類型的指針變量。在指針的教學(xué)過(guò)程中,必須注意指向數(shù)組元素的指針、指向指針的指針、指向數(shù)組的指針、指針數(shù)組等概念的區(qū)別與聯(lián)系。

        2.1 指向數(shù)組元素的指針

        指向數(shù)組元素的指針變量的定義與以前的指針變量的定義一樣,但要確保數(shù)組的類型與指針變量的類型一致。例如:

        以上的兩條語(yǔ)句定義了指向一維數(shù)組a的元素的指針變量p,并且對(duì)指針變量p進(jìn)行初始化,使其指向數(shù)組的首元素a[0]。接下來(lái)我們就可以使用指針變量p訪問(wèn)數(shù)組元素。例如p+1指向元素a[1],注意p+1不是將p的數(shù)值簡(jiǎn)單加1,而是使其指向當(dāng)前元素的下一元素。所以*(p+1)與a[1]等價(jià)。更一般化,p+i (0≤i≤4)表示指針變量p指向數(shù)組的a[i]元素,所以*(p+i)與a[i]等價(jià)。當(dāng)然也可以直接用數(shù)組名直接訪問(wèn)數(shù)組元素,因?yàn)閿?shù)組名代表數(shù)組首元素的地址,所以有*(a+i)與*(p+i)等價(jià)。

        以上介紹了用指針變量訪問(wèn)一維數(shù)組元素,接下來(lái)介紹指針變量訪問(wèn)二維數(shù)組元素。例如:

        想要訪問(wèn)二維數(shù)組中的元素a[2][3],可以用如下的方法:

        (1)直接用數(shù)組下標(biāo)a[2][3];

        (2)用一維數(shù)組名a訪問(wèn):*(a[2]+3)或*(a[0]+11)或*(a[3]-1];

        (3)用二維數(shù)組名a訪問(wèn),只要將(2)中的一維數(shù)組名改成相應(yīng)的二維數(shù)組名即可:*(*(a+2)+3)或*(*(a+0)+11)或*(*(a+3)-1);

        (4)用指針變量p訪問(wèn):*(*(p+2)+3)或*(*(p+0)+11)或*(*(p+3)-1)等等。

        2.2 指向指針的指針

        指向指針的指針是指一個(gè)指針變量指向了另外一個(gè)指針變量,常稱為多級(jí)間址。例如:

        語(yǔ)句(1)、(2)、(3)定義了指向指針的指針變量q并且對(duì)其進(jìn)行初始化,指針變量q指向了指針變量p,而指針變量p指向了普通變量i。 運(yùn)行程序可知,i address is 0018FF34,p address is 0018FF30,q address is 0018FF2C,p=0018FF34,q=0018FF30,*p= 20,**q=20。普通變量i、指針變量p和指向指針的指針變量q的關(guān)系如圖2所示。

        圖2 指向指針的指針變量關(guān)系

        從圖2可以看出指向指針的指針變量q的值為指針變量p的地址,也就是說(shuō)指向指針的指針變量q指向了指針變量p。指針變量p的值為普通變量i的地址,也就是說(shuō)指針變量p指向了普通變量i。*q指向了普通變量i,因此,**q的值就是i的值等于20。

        2.3 指向數(shù)組的指針

        指向數(shù)組的指針是數(shù)組名的指針,即數(shù)組首元素的指針,其實(shí)質(zhì)為指針。接下來(lái)的實(shí)例將介紹指向一維數(shù)組的指針。

        void main( ){

        (1) int a[]={10,20,30,40,50};

        (2) int (*p)[5];

        (3) p=&a;

        (4) printf(“%d ”, *(*p+3) );

        (5) int b[2][4]={{0,1,2,3},{4,5,6,7}};

        (6) printf(“%d ”, *(*(b+1)+3) );}

        語(yǔ)句(2)聲明p是一個(gè)指向一維數(shù)組的指針,且所指向的一維數(shù)組的長(zhǎng)度為5,其實(shí)質(zhì)相當(dāng)于二級(jí)間址。語(yǔ)句(3)將p初始化,使其指向一維數(shù)組a。*p的值和a的值一樣,都指向a[0],(*p+3)指向a[3],所以語(yǔ)句(4)的輸出結(jié)果為40。注意語(yǔ)句(3)不可以寫成p=a,因?yàn)楸M管a是數(shù)組名代表數(shù)組元素的首地址,但其與數(shù)組名的地址是兩回事。實(shí)際上,二維數(shù)組名就是一個(gè)指向一維數(shù)組的指針,所以語(yǔ)句(6)的輸出結(jié)果為7。接下來(lái)的實(shí)例將介紹指向二維數(shù)組的指針。

        void main( ){

        (1) int a[2][3]={10,20,30,40,50,60};

        (2) int (*p)[2][3];

        (3) p=&a;

        (4) printf(“%d ”, *(*(*p+1)+2));

        語(yǔ)句(2)聲明p是一個(gè)指向二維數(shù)組的指針,且所指向的二維數(shù)組的第一維長(zhǎng)度為2,第二維長(zhǎng)度為3,其實(shí)質(zhì)是指向二級(jí)指針的指針,相當(dāng)于三級(jí)間址。語(yǔ)句(3)將p初始化,使其指向二維數(shù)組a。*p的值為a,(*p+1)指向一維數(shù)組a[1],*(*p+1)+2指向二維數(shù)組元素a[1][2],所以語(yǔ)句(4)的輸出結(jié)果為60。

        2.4 指針數(shù)組

        指針數(shù)組是指由若干個(gè)相同類型的指針組成的數(shù)組,其實(shí)質(zhì)是數(shù)組。指針數(shù)組與普通數(shù)組的本質(zhì)區(qū)別在于指針數(shù)組的元素是指針,而普通數(shù)組的元素是數(shù)值。指針數(shù)組與指向數(shù)組的指針的本質(zhì)區(qū)別在于指針數(shù)組的實(shí)質(zhì)是數(shù)組,而指向數(shù)組的指針其實(shí)質(zhì)是指針。接下來(lái)的實(shí)例將介紹指針數(shù)組的定義及使用。

        void main( ){

        (1) char *p[4]={“apple”, “orange”, “pear”, “banana”};

        (2) int i=2;

        (3) printf(“%s ”, p[2]);}

        語(yǔ)句(1)定義了指針數(shù)組p,它由4個(gè)元素(p[0]~p[3])組成,每個(gè)元素都是一個(gè)指向字符類型的指針。此外語(yǔ)句(1)還初始化了指針數(shù)組p,使p[0]的值指向字符串a(chǎn)pple的首地址,p[1]的值指向字符串orange的首地址,p[2]的值指向字符串pear的首地址,p[3]的值指向字符串banana的首地址。特別需要注意區(qū)分char *p[4]與char (*p)[4],前者是指針數(shù)組,后者是指向一維數(shù)組的指針。語(yǔ)句(3)輸出的結(jié)果為pear。

        3 指針與函數(shù)

        3.1 指針作為函數(shù)參數(shù)

        整型、實(shí)型、字符型、數(shù)組、指針等都可以作為函數(shù)的參數(shù),但整型、實(shí)型、字符型等作為函數(shù)參數(shù)時(shí),實(shí)參與形參間是單向的值傳遞,也就是說(shuō)形參的值發(fā)生變化不會(huì)影響到實(shí)參。而指針作為參數(shù)時(shí),實(shí)參與形參間是傳遞的是地址,也就是說(shuō)實(shí)參與形參共享一個(gè)地址空間,如果形參的值發(fā)生改變,實(shí)參的值也會(huì)相應(yīng)的改變。例如:

        上述實(shí)例中,函數(shù)void swap(int *p, int *q)是以指針作為形參,其作用是交換兩個(gè)形參的值。在主函數(shù)中,定義了兩個(gè)整形變量a、b并且分別賦值為10、20;此外,還定義了兩個(gè)整形的指針變量pa、pb使其分別指向a和b。調(diào)用函數(shù)swap時(shí),需要注意的是實(shí)參的類型和形參的類型必須一致,在調(diào)用函數(shù)swap之后,程序輸出a=20,b=10,說(shuō)明以指針作為函數(shù)參數(shù),形參的值變化,相應(yīng)的實(shí)參的值也發(fā)生改變。

        3.2 指針函數(shù)

        指針函數(shù)是指函數(shù)的返回值為指針類型,也就是說(shuō)函數(shù)最后返回的是一個(gè)地址,而不是一個(gè)數(shù)值。指針函數(shù)的定義形式為:

        類型標(biāo)識(shí)符 *函數(shù)名(參數(shù)名){

        函數(shù)體

        以上實(shí)例中,首先定義了全局變量a,并且對(duì)其初始化,使其值為10;接下來(lái)定義了指針函數(shù)fun(),其返回類型為指向整型的指針,其參數(shù)列表為空。fun()函數(shù)的主要作用是返回全局變量a的地址。主函數(shù)首先定義了整型指針變量p,接下來(lái)對(duì)其初始化,使其指向fun()函數(shù),接著輸出p所指向?qū)ο蟮闹?,最終的運(yùn)行結(jié)果為*p=10。注意到指針函數(shù)不能返回局部變量的地址,因?yàn)榫植孔兞吭诔绦驁?zhí)行完成后,其所占用的內(nèi)存空間會(huì)被系統(tǒng)回收。

        3.3 函數(shù)指針變量

        一個(gè)函數(shù)在內(nèi)存中的起始地址就是該函數(shù)的指針。函數(shù)指針變量是用來(lái)存儲(chǔ)函數(shù)指針,通過(guò)函數(shù)指針變量可以調(diào)用函數(shù)。函數(shù)指針變量的定義如下:

        類型標(biāo)識(shí)符 (*指針變量名)(參數(shù)類型1,參數(shù)類型2,…,參數(shù)類型n);

        例如:

        以上實(shí)例中,首先定義了add函數(shù),其有兩個(gè)整型的參數(shù)a和b,add函數(shù)最終返回一個(gè)整型值,add函數(shù)的作用是求a與b的和。主函數(shù)首先定義了整型變量a和b,且分別對(duì)其初始化,a的值為5,b的值為10。語(yǔ)句int (*p_fun)(int,int);定義了函數(shù)指針變量p_fun。注意函數(shù)指針變量與指針函數(shù)的區(qū)別,int *p_fun(int,int)表示p_fun是指針函數(shù),其返回一個(gè)指向整型的指針。區(qū)別函數(shù)指針變量與指針函數(shù)主要看這二者在定義過(guò)程中“*”號(hào)是否用圓括號(hào)()括起來(lái),有圓括號(hào)表示函數(shù)指針變量,沒有圓括號(hào)表示指針函數(shù)。接下來(lái)的語(yǔ)句p_fun=add;對(duì)函數(shù)指針變量進(jìn)行初始化,使其指向add函數(shù)在內(nèi)存中的首地址,注意到在C語(yǔ)言中函數(shù)名稱代表函數(shù)在內(nèi)存的起始地址。接下來(lái)的語(yǔ)句輸出(*p_fun)(a,b)的值,其結(jié)果為15。注意到(*p_fun)(a,b)也可以寫成p_fun(a,b)。

        4 結(jié) 論

        總之,在C語(yǔ)言的教學(xué)中要注意結(jié)合實(shí)例講清以下幾點(diǎn):①指向指針的指針其實(shí)質(zhì)是二級(jí)間址;②指向數(shù)組的指針其實(shí)質(zhì)是指針,而指針數(shù)組其實(shí)質(zhì)是數(shù)組;③指針函數(shù)其實(shí)質(zhì)是指針,而函數(shù)指針其實(shí)質(zhì)為函數(shù)。

        [1] 劉韶濤, 潘秀霞, 應(yīng)暉. C語(yǔ)言程序設(shè)計(jì)[M]. 北京: 清華大學(xué)出版社, 2015.

        [2] 趙輝, 馮東棟. C語(yǔ)言中指針的教學(xué)方法研究[J]. 福建電腦, 2011, 27(4): 187-188.

        (編輯:彭遠(yuǎn)紅)

        1672-5913(2017)01-0155-04

        G642

        華僑大學(xué)引進(jìn)人才科研啟動(dòng)基金項(xiàng)目(2016BS104)。

        張憶文,男,講師,研究方向?yàn)榫G色計(jì)算、實(shí)時(shí)調(diào)度,zyw@hqu.edu.cn。

        猜你喜歡
        數(shù)組指針指向
        JAVA稀疏矩陣算法
        科學(xué)備考新指向——不等式選講篇
        JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
        偷指針的人
        把準(zhǔn)方向盤 握緊指向燈 走好創(chuàng)新路
        為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
        尋找勾股數(shù)組的歷程
        基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
        ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
        VB數(shù)組在for循環(huán)中的應(yīng)用
        考試周刊(2012年88期)2012-04-29 04:36:47
        av网站一区二区三区| 久久狠狠色噜噜狠狠狠狠97| 人人妻人人爽人人澡人人| 国产精品深田咏美一区二区| 国产日产精品久久久久久| 久久麻豆精亚洲av品国产精品 | 嗯啊好爽高潮了在线观看| 国产v片在线播放免费无码| 国产精品jizz视频| 538在线啪在线观看| 日本精品免费一区二区三区| 国产香蕉尹人在线视频你懂的| 精品女厕偷拍视频一区二区区| 日韩人妻少妇一区二区三区| 97精品依人久久久大香线蕉97| 精品一区二区三区在线视频观看| 国产大片在线观看三级| 国产亚洲综合另类色专区| 手机免费在线观看av网址| 无码人妻丰满熟妇区bbbbxxxx| 欧美人妻精品一区二区三区 | 日本一区二区精品色超碰| 人妻在线有码中文字幕| 亚洲av日韩综合一区久热| 老少交欧美另类| 91精品亚洲一区二区三区| 亚洲第一黄色免费网站| 天天躁日日躁狠狠躁欧美老妇| 亚洲成a人片在线观看无码| 人妻无码Aⅴ中文系列| 区一区一日本高清视频在线观看| 日本第一影院一区二区| 成人美女黄网站色大免费的 | 中文字幕人妻系列一区尤物视频| 亚洲av第二区国产精品| 欧美性白人极品1819hd| 消息称老熟妇乱视频一区二区| 国产精品无套内射迪丽热巴| 国产成人精品人人做人人爽| 99在线视频这里只有精品伊人| 日韩视频中文字幕精品偷拍|