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

        ?

        對(duì)C語(yǔ)言指針教學(xué)問題的探究

        2009-11-02 07:21:24趙忠孝楊亞蕾
        計(jì)算機(jī)教育 2009年19期
        關(guān)鍵詞:數(shù)組指針函數(shù)

        趙忠孝 楊亞蕾

        摘要:本文討論了C語(yǔ)言中指針的各種應(yīng)用形式,認(rèn)真分析了指針在數(shù)組、函數(shù)和動(dòng)態(tài)內(nèi)存分配等方面應(yīng)用的特點(diǎn)和優(yōu)點(diǎn),對(duì)如何學(xué)好和掌握C語(yǔ)言的指針有十分重要的指導(dǎo)意義。

        關(guān)鍵詞:指針;指針變量;數(shù)組;函數(shù);動(dòng)態(tài)內(nèi)存分配

        中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A

        1引言

        指針是C語(yǔ)言中一種特殊的數(shù)據(jù)類型,運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以訪問各種類型的數(shù)據(jù);能動(dòng)態(tài)地分配內(nèi)存空間;能很方便地使用數(shù)組和字符串;并能像匯編語(yǔ)言一樣處理內(nèi)存地址,編出精練而高效的程序。但是,大部分學(xué)生對(duì)指針的理解和應(yīng)用還是感到困惑,特別是什么場(chǎng)合用到什么類型的指針變量,應(yīng)用指針變量應(yīng)注意哪些問題等。本文對(duì)指針應(yīng)用中的一些問題進(jìn)行了梳理,以利于學(xué)生掌握指針的應(yīng)用。

        2數(shù)組中指針的應(yīng)用

        2.1使用指針引用數(shù)組元素的優(yōu)點(diǎn)

        對(duì)數(shù)組元素既可以用下標(biāo)a[i]的方式引用,也可以用指針變量*p的方式引用。應(yīng)該說(shuō),下標(biāo)方式能對(duì)數(shù)組進(jìn)行隨機(jī)訪問,指針變量卻做不到這一點(diǎn)。但是,引入指針的主要目的是為了提高對(duì)數(shù)組元素訪問的速度。

        在C語(yǔ)言中,數(shù)組中每一維下標(biāo)的下界定義為0。對(duì)一維數(shù)組,設(shè)a[i]的存儲(chǔ)地址為L(zhǎng)oc(a[i]),每個(gè)數(shù)據(jù)元素占d個(gè)存儲(chǔ)地址,則第i個(gè)數(shù)據(jù)元素的地址為

        Loc(a[i])=Loc(a[0])+i*d (1)

        對(duì)二維數(shù)組a[m][n],a[m][n]的存儲(chǔ)地址是:

        Loc(a[i][j])=Loc(a[0][0]) + ( i*n + j ) * d (2)

        實(shí)際上,對(duì)數(shù)組元素的引用,都要先計(jì)算數(shù)組元素的地址,才能對(duì)指定單元進(jìn)行操作。顯然,一維數(shù)組中的地址要進(jìn)行1次乘法和1次加法運(yùn)算;二維數(shù)組中的地址則要進(jìn)行2次乘法和2次加法運(yùn)算。如果用指針變量p指向數(shù)組,連續(xù)對(duì)數(shù)組元素進(jìn)行引用,可用p++和p--來(lái)移動(dòng)指針。每次的引用地址只須進(jìn)行簡(jiǎn)單的加法運(yùn)算,引用數(shù)組元素的速度比使用數(shù)組下標(biāo)要快得多。表1是在IBM-R40上使用下標(biāo)和指針兩種不同方式對(duì)10000個(gè)元素進(jìn)行10000次訪問的時(shí)間比較。

        從測(cè)試結(jié)果看,隨著數(shù)組維數(shù)的增加,使用指針方式訪問數(shù)組的速度基本不變,但下標(biāo)方式的訪問速度明顯減慢。

        2.2動(dòng)態(tài)數(shù)組的應(yīng)用

        在C語(yǔ)言中,數(shù)組一般都是靜態(tài)的。數(shù)組已經(jīng)定義,所占用的內(nèi)存空間就一直被占用,直到該函數(shù)退出時(shí)為

        止。但如果使用指針變量,就可以實(shí)現(xiàn)需要時(shí)給數(shù)組分配內(nèi)存,不需要時(shí)釋放內(nèi)存,可節(jié)約大量的內(nèi)存空間。下面的程序就是使用了指針變量,使用動(dòng)態(tài)數(shù)組的一個(gè)例子。

        typedef struct

        {int a[MAXSIZE];

        } A;

        main()

        {int i;

        A *p;

        p=(A *)malloc(sizeof(A));/*動(dòng)態(tài)分配內(nèi)存*/

        …………

        free(p);/*釋放內(nèi)存*/

        }

        3函數(shù)參數(shù)中指針的應(yīng)用

        在C語(yǔ)言中,函數(shù)的形參是局部變量。實(shí)參和形參變量間的傳遞是值傳遞,即將實(shí)參的值傳遞給形參變量。形參在函數(shù)中如何變化,并不改變實(shí)參的值,我們稱之為單向傳遞。這種參數(shù)的單向傳遞減少了函數(shù)之間的耦合性,增加了其內(nèi)聚性,有利于結(jié)構(gòu)化編程。但是,如果調(diào)用函數(shù)想從被調(diào)函數(shù)中得到一個(gè)以上的返回值,就比較困難。當(dāng)然,通過(guò)全局變量也能實(shí)現(xiàn),但過(guò)多的使用全局變量又增加了函數(shù)之間的耦合性,不利于結(jié)構(gòu)化編程。如果實(shí)參和形參都使用指針變量,就可達(dá)到此目的。下面的程序就是使用指針變量實(shí)現(xiàn)兩個(gè)變量值交換的例子。

        int swap(int *p1,int *p2)

        {int temp;

        temp=*p1;

        *p1=*p2;

        *p2=temp;

        }

        main()

        {

        int a,b;

        int *pointer_1,*pointer_2;

        scanf("%d,%d",&a,&b);

        pointer_1=&apointer_2=&b

        if(a

        printf(" %d,%d ",a,b);

        }

        需要說(shuō)明的是:

        (1) 實(shí)參和形參之間傳遞的仍然是值,但該值不是變量的值,而是變量的地址,如圖1所示。此時(shí),實(shí)參和形參都指向了同一變量,對(duì)形參變量所指變量值的改變也必然改變實(shí)參變量的值,如圖2所示。

        (2) 但在被調(diào)函數(shù)中不能改變形參指針變量的指向,否則實(shí)參變量和形參變量各指向不同的變量。如:p=p1;p1=p2;p2=p;僅交換了形參變量的指向,實(shí)參變量的指向并沒有改變,也就是不能企圖通過(guò)改變形參指針的值而使實(shí)參指針的值也發(fā)生改變,如圖3所示。

        4指向指針的指針變量的應(yīng)用

        如果說(shuō)指針是C語(yǔ)言中比較難掌握的內(nèi)容,而指針的指針則是更加難學(xué)難懂。學(xué)生往往不知道指針的指針到底應(yīng)用在哪些方面,有什么特點(diǎn)和優(yōu)點(diǎn)。

        如果一組變量只能通過(guò)指針(地址)來(lái)引用,一般來(lái)說(shuō)就需要用指針的指針變量來(lái)實(shí)現(xiàn)。C語(yǔ)言中沒有字符串變量,只能在字符數(shù)組中存儲(chǔ)字符串。對(duì)二維字符串?dāng)?shù)組的引用大都要用到指向指針的指針變量,在各種教科書都舉過(guò)這樣的例子,也就不再贅述了?,F(xiàn)在主要對(duì)指針的指針在函數(shù)參數(shù)中的應(yīng)用進(jìn)行探討。

        如果主調(diào)函數(shù)要得到一個(gè)以上普通變量的返回值,函數(shù)的形參可以用指針變量來(lái)實(shí)現(xiàn)。同樣,如果要返回一個(gè)改變了的指針變量的指向,形參就需要用指向指針的指針變量。比如,在對(duì)二叉排序樹的操作中,每個(gè)結(jié)點(diǎn)是一個(gè)指針變量,當(dāng)刪除一個(gè)節(jié)點(diǎn)后,為了使其仍能保持二叉排序樹原有的特性,必須對(duì)其余結(jié)點(diǎn)進(jìn)行整理。如果刪除的是根結(jié)點(diǎn),刪除后二叉排序樹的根結(jié)點(diǎn)就發(fā)生了變化,如圖4所示。應(yīng)該將新的根結(jié)點(diǎn)(指針變量)返回,此時(shí)形參就應(yīng)該用指向指針的指針變量。

        int DeleteNode(NodeType **t,KeyType kx)

        {NodeType *p=*t,*q,*s,**f;

        int flag=0;

        if(SearchElem(*t,&p,&q,kx)); /*查找值為kx的結(jié)點(diǎn),p指向該結(jié)點(diǎn),q指向其父結(jié)點(diǎn)*/

        {flag=1; /*查找成功,置刪除成功標(biāo)志*/

        …… /*確定刪除結(jié)點(diǎn)為根結(jié)點(diǎn)p,調(diào)整二叉排序樹*/

        t= p->lc ; /*p左孩子為新根結(jié)點(diǎn)*/

        ree(p);

        }

        return flag;

        }

        這樣,主調(diào)函數(shù)的實(shí)參變量就指向了二叉排序樹新的根結(jié)點(diǎn)。

        5注意兩個(gè)區(qū)別

        5.1數(shù)組指針變量和指針數(shù)組變量

        (1) 數(shù)組指針變量

        int (*p)[4];

        方括號(hào)“[4]”前面(*p)不是合法的標(biāo)識(shí)符,因此(*p)[4]不是數(shù)組。定義中有*p,則p一定是指針變量,后面又有方括號(hào)“[4]”,肯定是和數(shù)組有關(guān)的指針變量。它表示p是一個(gè)指針變量,指向包含4個(gè)元素的一維數(shù)組。

        猜你喜歡
        數(shù)組指針函數(shù)
        JAVA稀疏矩陣算法
        二次函數(shù)
        第3講 “函數(shù)”復(fù)習(xí)精講
        二次函數(shù)
        函數(shù)備考精講
        JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
        偷指針的人
        為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
        尋找勾股數(shù)組的歷程
        基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
        午夜射精日本三级| 有码中文字幕一区二区| 91人妻人人做人人爽九色| 国产亚洲精品90在线视频| 性久久久久久| 白又丰满大屁股bbbbb| 国产激情视频在线观看首页| 伊人亚洲综合影院首页| 成人男性视频在线观看| 女人18片毛片60分钟| 麻豆影视视频高清在线观看| 中国亚洲女人69内射少妇| 亚洲人成无码网站十八禁| 亚洲精品女人天堂av麻| 国产婷婷色一区二区三区深爱网 | 一区二区黄色素人黄色 | 人妻少妇精品无码专区动漫| 欧美国产成人精品一区二区三区| 亚洲 国产 韩国 欧美 在线| 国产一区二区不卡av| 久久成人国产精品一区二区| 久久超碰97人人做人人爱 | 一区二区三区乱码在线 | 欧洲| 丰满少妇愉情中文字幕18禁片| 久久久久久久久高潮无码| 中文字幕久久精品一区二区| 国产区女主播在线观看| 国产成人无码免费视频在线 | 国产欧美另类精品久久久| 国产91精品清纯白嫩| 色视频网站一区二区三区| 挺进朋友人妻雪白的身体韩国电影| 亚洲国产一区在线二区三区| 国产亚洲一区二区三区三州| 三区中文字幕在线观看| 亚洲成a∨人片在线观看不卡| 国产精品美女久久久浪潮av| 最大色网男人的av天堂| 日韩精品人妻系列中文字幕| 精品久久久久久无码人妻蜜桃| 亚洲日韩欧美国产另类综合|