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