999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

對C語言指針教學問題的探究

2009-11-02 07:21:24趙忠孝楊亞蕾
計算機教育 2009年19期

趙忠孝 楊亞蕾

摘要:本文討論了C語言中指針的各種應用形式,認真分析了指針在數組、函數和動態內存分配等方面應用的特點和優點,對如何學好和掌握C語言的指針有十分重要的指導意義。

關鍵詞:指針;指針變量;數組;函數;動態內存分配

中圖分類號:G642 文獻標識碼:A

1引言

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

2數組中指針的應用

2.1使用指針引用數組元素的優點

對數組元素既可以用下標a[i]的方式引用,也可以用指針變量*p的方式引用。應該說,下標方式能對數組進行隨機訪問,指針變量卻做不到這一點。但是,引入指針的主要目的是為了提高對數組元素訪問的速度。

在C語言中,數組中每一維下標的下界定義為0。對一維數組,設a[i]的存儲地址為Loc(a[i]),每個數據元素占d個存儲地址,則第i個數據元素的地址為

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

對二維數組a[m][n],a[m][n]的存儲地址是:

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

實際上,對數組元素的引用,都要先計算數組元素的地址,才能對指定單元進行操作。顯然,一維數組中的地址要進行1次乘法和1次加法運算;二維數組中的地址則要進行2次乘法和2次加法運算。如果用指針變量p指向數組,連續對數組元素進行引用,可用p++和p--來移動指針。每次的引用地址只須進行簡單的加法運算,引用數組元素的速度比使用數組下標要快得多。表1是在IBM-R40上使用下標和指針兩種不同方式對10000個元素進行10000次訪問的時間比較。

從測試結果看,隨著數組維數的增加,使用指針方式訪問數組的速度基本不變,但下標方式的訪問速度明顯減慢。

2.2動態數組的應用

在C語言中,數組一般都是靜態的。數組已經定義,所占用的內存空間就一直被占用,直到該函數退出時為

止。但如果使用指針變量,就可以實現需要時給數組分配內存,不需要時釋放內存,可節約大量的內存空間。下面的程序就是使用了指針變量,使用動態數組的一個例子。

typedef struct

{int a[MAXSIZE];

} A;

main()

{int i;

A *p;

p=(A *)malloc(sizeof(A));/*動態分配內存*/

…………

free(p);/*釋放內存*/

}

3函數參數中指針的應用

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

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);

}

需要說明的是:

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

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

4指向指針的指針變量的應用

如果說指針是C語言中比較難掌握的內容,而指針的指針則是更加難學難懂。學生往往不知道指針的指針到底應用在哪些方面,有什么特點和優點。

如果一組變量只能通過指針(地址)來引用,一般來說就需要用指針的指針變量來實現。C語言中沒有字符串變量,只能在字符數組中存儲字符串。對二維字符串數組的引用大都要用到指向指針的指針變量,在各種教科書都舉過這樣的例子,也就不再贅述了。現在主要對指針的指針在函數參數中的應用進行探討。

如果主調函數要得到一個以上普通變量的返回值,函數的形參可以用指針變量來實現。同樣,如果要返回一個改變了的指針變量的指向,形參就需要用指向指針的指針變量。比如,在對二叉排序樹的操作中,每個結點是一個指針變量,當刪除一個節點后,為了使其仍能保持二叉排序樹原有的特性,必須對其余結點進行整理。如果刪除的是根結點,刪除后二叉排序樹的根結點就發生了變化,如圖4所示。應該將新的根結點(指針變量)返回,此時形參就應該用指向指針的指針變量。

int DeleteNode(NodeType **t,KeyType kx)

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

int flag=0;

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

{flag=1; /*查找成功,置刪除成功標志*/

…… /*確定刪除結點為根結點p,調整二叉排序樹*/

t= p->lc ; /*p左孩子為新根結點*/

ree(p);

}

return flag;

}

這樣,主調函數的實參變量就指向了二叉排序樹新的根結點。

5注意兩個區別

5.1數組指針變量和指針數組變量

(1) 數組指針變量

int (*p)[4];

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

主站蜘蛛池模板: 中文无码伦av中文字幕| 亚洲第一国产综合| 久久久久国产一级毛片高清板| 狠狠ⅴ日韩v欧美v天堂| 国产成年女人特黄特色毛片免| 亚洲欧洲日韩久久狠狠爱| 91极品美女高潮叫床在线观看| 欧美精品啪啪一区二区三区| 黄片在线永久| 欧美翘臀一区二区三区| 波多野结衣一区二区三区四区视频| 青青网在线国产| 国产成人久久777777| 国产真实乱了在线播放| 青青操视频在线| 国产欧美日韩资源在线观看| 色噜噜久久| 久久一日本道色综合久久| 欧美亚洲日韩中文| 人与鲁专区| 亚洲欧美日韩另类在线一| 在线日韩日本国产亚洲| 精品无码视频在线观看| 精品视频一区二区三区在线播| 国产精品无码影视久久久久久久| 福利视频久久| 久久人妻系列无码一区| 91小视频在线观看免费版高清| 国产成人无码久久久久毛片| 亚洲欧洲天堂色AV| 重口调教一区二区视频| 超薄丝袜足j国产在线视频| 亚洲精品欧美日韩在线| 欧美色图久久| 九九免费观看全部免费视频| 91麻豆精品视频| 啊嗯不日本网站| 97av视频在线观看| 成人福利在线免费观看| 好久久免费视频高清| 亚洲成aⅴ人在线观看| 狠狠做深爱婷婷久久一区| 欧美日韩专区| 在线视频亚洲色图| 九九久久精品免费观看| 国产69囗曝护士吞精在线视频| 久久精品人人做人人| 久草视频一区| 国产永久在线视频| 亚洲国产精品不卡在线 | 71pao成人国产永久免费视频| 亚洲VA中文字幕| 91久久青青草原精品国产| 国产麻豆另类AV| 四虎影视8848永久精品| 伊人欧美在线| 日本人妻丰满熟妇区| 亚洲国产日韩一区| 91麻豆精品国产91久久久久| 国产精品主播| 91在线播放国产| 亚洲天堂久久| 国产95在线 | 久久婷婷六月| 久草国产在线观看| 亚洲欧美一区二区三区图片| 成年人国产视频| 日韩精品成人在线| a级毛片免费看| 999国内精品视频免费| 国产一区二区三区日韩精品| 成人字幕网视频在线观看| 日本欧美中文字幕精品亚洲| 好吊日免费视频| 99视频在线看| 亚洲无码高清视频在线观看| 亚洲区第一页| 免费在线看黄网址| 香蕉久久国产超碰青草| 成人午夜网址| 亚洲欧美另类日本| 色综合天天娱乐综合网|