盧瑩瑩
摘 要: “指針”是C語言的精髓,是C語言區(qū)獨(dú)有的功能,在C語言的程序設(shè)計(jì)過程中起著不可或缺的作用。只有學(xué)好了指針才算掌握了C語言,同時(shí)指針也是C語言最危險(xiǎn)的特性,如果使用不當(dāng),則很容易指到意想不到的地方,產(chǎn)生錯(cuò)誤很難發(fā)現(xiàn)。應(yīng)該特別注意指針教學(xué),高效應(yīng)用指針,發(fā)揮C語言的優(yōu)勢(shì)。
關(guān)鍵詞: C語言 指針 函數(shù) 數(shù)組
“指針”是C語言中廣泛使用的一種數(shù)據(jù)類型,運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針可以表示各種數(shù)據(jù)結(jié)構(gòu),它與函數(shù)、數(shù)組的使用和傳遞數(shù)據(jù)有密切聯(lián)系,能方便地訪問數(shù)組,還能像匯編語言一樣處理內(nèi)存地址,從而編出精致而高效的程序。指針極大地強(qiáng)化了C語言的功能。學(xué)習(xí)指針是學(xué)習(xí)C語言最重要的一環(huán),能否正確理解和使用指針是判斷是否掌握了C語言的重要標(biāo)志。但是指針也是C語言最危險(xiǎn)的特性,如果使用不當(dāng),則很容易指到意想不到的地方,產(chǎn)生錯(cuò)誤也很難發(fā)現(xiàn)。因此,對(duì)于初學(xué)者來說,應(yīng)特別注意指針的應(yīng)用。怎樣才能應(yīng)用好指針呢?下面筆者以在計(jì)算機(jī)C語言教學(xué)中的體會(huì)與大家進(jìn)行探討。
一、理解指針
在C語言中任何數(shù)據(jù)只要定義了,在內(nèi)存中就是有一定的存儲(chǔ)單元的。存儲(chǔ)單元就是變量在計(jì)算機(jī)中的存儲(chǔ)地址,指針就是用來表示這些地址的變量。所以簡單地說,指針就是地址,變量的指針就是變量的地址,這里還涉及一個(gè)概念就是指針變量,所謂指針變量就是用來存放指針(地址)的變量。例如:int a;假設(shè)a的地址是2000,而2000又存儲(chǔ)在變量point中,那么變量point就是指針的變量簡稱指針變量,a就是指針變量所指向的變量。很多初學(xué)者都存在這樣的誤區(qū):既然指針放的是地址,而2000正好是變量a的地址,那么對(duì)于指針point就可以這樣賦值:point=2000,這是錯(cuò)誤的,這里的2000表示的不是地址是一個(gè)整型數(shù)據(jù)。所以對(duì)于指針變量的賦值只能用取地址運(yùn)算符“&”進(jìn)行賦值即:point=&a;&a即為a的地址。
二、指針與函數(shù)
指針作為C語言的精華有很多用途,除具有一般的功能外,其中具體特殊功能的應(yīng)用總結(jié)起來有三個(gè)方面:一是用于在函數(shù)中可以返回多個(gè)值;二是可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)用函數(shù);三是實(shí)現(xiàn)數(shù)組的動(dòng)態(tài)定義。其中,普通變量作為函數(shù)的參數(shù),傳遞的是變量的值,因此只能帶回一個(gè)返回值,但在有些場合需要返回多個(gè)值,這就必須用到指針做函數(shù)的參數(shù),因?yàn)橹羔樧鳛閰?shù)傳遞的是地址,讓實(shí)參和形參指向同一個(gè)變量的地址,N個(gè)形參所指向的變量的值改變了,N個(gè)實(shí)參的值也自然改變了,從而實(shí)現(xiàn)了帶回多個(gè)返回值。這里舉個(gè)例子,編寫一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)從小到大輸出。這個(gè)程序需要子函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換,把交換后的兩個(gè)值通過指針傳回主函數(shù)輸出,傳回來的是兩個(gè)值。所以普通變量做函數(shù)的參數(shù)是無法實(shí)現(xiàn)的,只能用指針作為函數(shù)的參數(shù)。具體實(shí)現(xiàn):
子函數(shù)實(shí)現(xiàn)交換:
swap(p1,p2)
int *p1,*p2;
{int p;
p=*p1;
*p1=*p2;
*p2=p;
}
主程序?qū)崿F(xiàn)調(diào)用,輸出:
main()
{int a,b;
int *pointer_1,*pointer_2;
scanf(“%d,%d”,&a,&b);
point_ 1=&a;
point_2=&b;
if(a
swap(point_1,point_2);
printf(“%d,%d”,a,b);
}
由此可見,要通過函數(shù)調(diào)用得到N個(gè)返回值可以通過以下三步實(shí)現(xiàn):(1)主調(diào)函數(shù)中設(shè)N個(gè)變量,用N個(gè)指針指向他們;(2)將指針變量作實(shí)參,將N個(gè)變量的地址傳給形參;(3)通過形參指針變量指向的改變,改變N個(gè)變量的值。最后主調(diào)函數(shù)中就可以得到N個(gè)變量的返回值。
三、指針與數(shù)組
前面提到任何數(shù)據(jù)都有存儲(chǔ)單元,都有指針。所以,從這個(gè)角度出發(fā)可以將指針分為:指向變量的指針、數(shù)組指針、字符指針、指向指針的指針、函數(shù)指針、結(jié)構(gòu)變量的指針及文件指針,等等。其中,指向變量的指針就是存儲(chǔ)變量的地址的,這是指針最簡單的一種類型。那么一個(gè)變量有地址,一個(gè)數(shù)組有若干個(gè)元素,每個(gè)元素都有一個(gè)地址,所謂數(shù)組的指針,就是指數(shù)組的名稱,實(shí)際上是指向整個(gè)數(shù)組空間的起始地址。數(shù)組元素的指針是數(shù)組元素的地址。例如:int a[10];int*p;這里的數(shù)組名a就是數(shù)組的首地址,本質(zhì)上是一個(gè)指針。a[2]表示距離a指向空間向后2個(gè)位置所在空間中的存放的值,所以a[2]=*(a+2)。那么如果讓p=a,p就是指向數(shù)組的指針,對(duì)于a我們可以做加減整數(shù)運(yùn)算,利用它表示數(shù)組中任何數(shù)據(jù)的值。那么對(duì)于指針也可以通過加減整數(shù)運(yùn)算來表示數(shù)組中的任何數(shù)據(jù)。指針變量加上或減區(qū)一個(gè)整數(shù)n表示把指針指向的當(dāng)前位置向前或向后移動(dòng)n個(gè)位置。具體移動(dòng)的字節(jié)數(shù)和指針數(shù)組的類型在內(nèi)存所占的字節(jié)數(shù)有關(guān)系,如果指針數(shù)組類型為整型,在內(nèi)存中占2個(gè)字節(jié),那么,指針p+1,實(shí)際上的地址值就是原址加2,對(duì)于數(shù)組元素來說就是指針向后移動(dòng)一個(gè)元素。如int a[10],*p,*s;p=a;s=p+2;其中s的值表示數(shù)組中首地址向后移動(dòng)2個(gè)數(shù)組元素的位置,表示a[2]對(duì)應(yīng)的地址,而具體移動(dòng)的字節(jié)數(shù)則為4個(gè)字節(jié)。為了表示兩個(gè)地址間存在的距離,可以通過指針間的減法實(shí)現(xiàn)。指針之間是不能有加法操作的,指針的加減運(yùn)算只能對(duì)數(shù)組指針變量進(jìn)行,對(duì)指向其他類型的變量的指針變量做加減運(yùn)算是毫無意義的。而且兩個(gè)指針變量之間的運(yùn)算只有指向同一數(shù)組時(shí)它們之間才能進(jìn)行運(yùn)算,否則運(yùn)算將失去意義。
四、結(jié)語
C語言是到目前為止學(xué)習(xí)最多的程序設(shè)計(jì)語言之一,也是國外大學(xué)計(jì)算機(jī)專業(yè)唯一的必修課程。在整個(gè)C語言教學(xué)中,指針是一個(gè)十分重要的部分,也是最難掌握的部分之一。本文從對(duì)指針概念的理解、指針在函數(shù)和數(shù)組的使用等方面系統(tǒng)論述了指針,目的是讓大家清晰地了解指針、掌握指針,從而高效地應(yīng)用指針。只有掌握好指針,才能充分發(fā)揮C語言的優(yōu)勢(shì)。
參考文獻(xiàn):
[1]譚浩強(qiáng).C程序設(shè)計(jì)教程.北京:清華大學(xué)出版社,2008,11.
[2]陳剛.C語言程序設(shè)計(jì).清華大學(xué)出版社,2010,2.
[3]魏海新,李燕.C語言程序設(shè)計(jì)實(shí)用教程.機(jī)械工業(yè)出版社,2007,7.
[4]路俊維,馬雪松.C語言程序設(shè)計(jì).中國鐵道工業(yè)出版社,2009,6.