徐云娟
摘 要:C語(yǔ)言數(shù)據(jù)類型非常豐富,其中一個(gè)重要的數(shù)據(jù)類型是指針,利用指針可以直接實(shí)現(xiàn)對(duì)內(nèi)存的數(shù)據(jù)進(jìn)行快速處理、實(shí)現(xiàn)函數(shù)間的調(diào)用等。但是由于指針概念較為復(fù)雜,使用起來非常靈活,所以對(duì)于大一的新生初次學(xué)習(xí)程序語(yǔ)言設(shè)計(jì),在學(xué)習(xí)到指針這一數(shù)據(jù)類型的時(shí)候往往難以掌握。因此在教學(xué)中,教師需要根據(jù)學(xué)生的實(shí)際情況合理的安排這一知識(shí)點(diǎn)的學(xué)習(xí),一般可以按照數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式合理地進(jìn)行教學(xué)設(shè)計(jì),幫助學(xué)生理解指針的概念,從而熟練掌握指針的使用。
關(guān)鍵詞:指針;程序;內(nèi)存
1 指針的概念
首先要讓學(xué)生明確指針也是一種數(shù)據(jù)類型。為了讓學(xué)生很好的理解指針到底是一種什么樣的數(shù)據(jù)類型,就必須讓學(xué)生理解數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)的。內(nèi)存是以字節(jié)為單位的一片連續(xù)的存儲(chǔ)空間,每一個(gè)字節(jié)單元都對(duì)應(yīng)著一個(gè)唯一的存儲(chǔ)單元的編號(hào),這個(gè)存儲(chǔ)單元的編號(hào)就稱為內(nèi)存單元的地址,簡(jiǎn)稱地址??梢耘e例學(xué)生宿舍,內(nèi)存單元的地址就相當(dāng)于我們學(xué)生所在宿舍的房間號(hào),在內(nèi)存地址所標(biāo)識(shí)的內(nèi)存單元中所存放的數(shù)據(jù),就相當(dāng)于學(xué)生宿舍里入住的學(xué)生一樣,可以有單人間,雙人間,四人間等等。即根據(jù)數(shù)據(jù)類型的不一樣,分配不同的存儲(chǔ)空間。如下定義:char n; float d;int m ; 變量的類型不一樣,內(nèi)存為各自分配存儲(chǔ)空間也不一樣。由于變量n是字符型數(shù)據(jù),所以內(nèi)存分配其1個(gè)字節(jié)的存儲(chǔ)單元;變量d是浮點(diǎn)型數(shù)據(jù),所以內(nèi)存分配其4個(gè)字節(jié)的存儲(chǔ)單元;變量m是整型數(shù)據(jù),所以內(nèi)存分配其2個(gè)字節(jié)的存儲(chǔ)單元。所謂變量的地址就是內(nèi)存為各變量所分配的存儲(chǔ)空間的第一個(gè)字節(jié)單元的地址。即地址就是用來標(biāo)識(shí)數(shù)據(jù)的存儲(chǔ)單元的一種數(shù)據(jù)類型,方便用戶對(duì)存儲(chǔ)在各自單元中的數(shù)據(jù)進(jìn)行正確的訪問,在C語(yǔ)言中就將地址稱為指針。指針可以用來指向變量、結(jié)構(gòu)體\\數(shù)組及其元素以及指針等。
2 區(qū)分變量、變量名、變量的地址和變量值
為了更好的理解指針這種類型的數(shù)據(jù),我們先來理解一下變量、變量名、變量的地址和變量值的區(qū)別。所謂的變量即命名的內(nèi)存空間。變量在內(nèi)存中占有一定空間,用于存放各種相應(yīng)類型的數(shù)據(jù);所謂的變量名即給內(nèi)存空間所取的一個(gè)容易記憶的名字;所謂的變量的地址即變量所使用的內(nèi)存空間的地址(內(nèi)存單元的編號(hào));所謂的變量值即所對(duì)應(yīng)的內(nèi)存單元中存放的數(shù)值。
3 指針變量的定義、賦值和引用
(一)指針變量的定義格式:基類型 *變量名;
例如: int *n; /*定義一個(gè)指向整數(shù)據(jù)的指針變量n*/
char *m; /*定義一個(gè)指向字符型數(shù)據(jù)的指針變量m*/
float *p; /*定義一個(gè)指向浮點(diǎn)型數(shù)據(jù)的指針變量p*/
注意:C語(yǔ)言所有的變量必須是先定義然后再使用。指針變量也必須如此,為了表示指針變量是存放地址的一種特殊變量,所以在定義變量時(shí)會(huì)在變量名前加“*”號(hào);指針變量的基類型表示指針變量所指向數(shù)據(jù)的類型,因各數(shù)據(jù)類型占用的存儲(chǔ)空間不一樣,指針變量的某些操作具有特殊的含義。如指針變量加1,不是純粹的加1個(gè)字節(jié), 而是加一個(gè)所指向變量的字節(jié)個(gè)數(shù),例如:int *p, b=100; p=&b;其中執(zhí)行p++;指的是p值加2個(gè)字節(jié)。
(二)指針變量的賦值方法
(1)變量的地址賦值給指針變量,例如:int a, *p;p=&a;
(2)相同類型的指針變量之間賦值,例如:int a, *p1,*p2;p1=&a;p2=p1;
(3)賦空值NULL,例如:int *p1 =NULL;
(三)指針變量的具體使用
首先區(qū)分“&”運(yùn)算符和“*”運(yùn)算符?!?amp;”運(yùn)算符表示取變量的地址, “*”運(yùn)算符表示訪問指針變量所指向的變量的值。在定義指針變量時(shí)”*”是指針變量的標(biāo)志,沒有特殊含義,但在具體使用中要注意,在指針變量前加了”*”, 表示取其所指向變量的值。從變量名獲得變量地址用“&”運(yùn)算符,從地址獲得地址指向的數(shù)據(jù)用“*”運(yùn)算符。
例如:int a=3,*p=&a;
具體訪問數(shù)據(jù)時(shí),可以按變量名直接訪問,如:a=3;而利用指向變量的的指針去訪問屬于間接訪問,即變量a的地址(指針)存放在指針變量p中,p=&a(p指向a),然后利用指針變量p進(jìn)行變量a的訪問*p=3,這就是間接訪問。
4 指針變量可以作為函數(shù)的參數(shù)
指針變量和其它數(shù)據(jù)類型的變量一樣也作為函數(shù)參數(shù),區(qū)別只是傳遞的內(nèi)容是一個(gè)地址值。而且可以通過這個(gè)地址值間接改變實(shí)參、形參所共同指向的變量的值。
例如:輸入a,b,交換a,b數(shù)據(jù)后輸出。
void fun(int *p1, int *p2)
{int temp;
temp=*p1;
*p1=*p2 ;
*p2=temp;}
main()
{int a=3,b=5,*pa, *pb;
pa=&a;
pb=&b;
fun(pa,pb);
printf(“swaped:\n”);
printf(“a=%d,b=%d\n”,a,b);}
5 總結(jié)
本文主要介紹了指針的基本概念及其使用。由于指針這種數(shù)據(jù)類型比較靈活,所以學(xué)生剛開始使用時(shí)容易出錯(cuò),可以通過指導(dǎo)學(xué)生上機(jī)調(diào)試程序,弄清程序中的細(xì)節(jié),區(qū)分指針與其它數(shù)據(jù)類型的區(qū)別,累積編程得經(jīng)驗(yàn),以達(dá)到熟練的使用它。
參考文獻(xiàn):
[1]董漢麗.C語(yǔ)言程序設(shè)計(jì)[M].大連:大連理工出版社,2002.