謝忠東
摘 要:指針是C語言的精華部分,也是C語言課程的重點(diǎn)和難點(diǎn)章節(jié)之一,在C語言編程中起著重要的作用。只有理解了指針并能靈活運(yùn)用指針,才算真正學(xué)會(huì)了C語言。因此我們?cè)贑語言教學(xué)過程中應(yīng)特別注意指針,引導(dǎo)學(xué)生正確靈活地應(yīng)用指針,編制高效的程序,發(fā)揮C語言的優(yōu)勢(shì)。
關(guān)鍵詞:C語言;指針;函數(shù);數(shù)組
指針是C語言中一個(gè)重要的概念,是C語言課程的重點(diǎn)難點(diǎn)章節(jié)之一,也是C語言的精華部分,在C語言編程中起著重要的作用。利用指針可以編寫靈活高效的程序。只有理解了指針并能靈活運(yùn)用指針,才算真正學(xué)會(huì)了C語言。因此我們?cè)贑語言教學(xué)過程中應(yīng)特別注意指針單元,引導(dǎo)學(xué)生正確靈活地應(yīng)用指針,編制高效的程序,發(fā)揮C語言的優(yōu)勢(shì)。但由于指針是一種特殊的數(shù)據(jù)類型,概念較復(fù)雜,大多數(shù)初學(xué)者感到較難理解,使用不好反而會(huì)帶來一些麻煩。
1 理解指針概念
在C語言中定義的任意變量,在內(nèi)存中都占用一定的存儲(chǔ)單元。存儲(chǔ)單元的每個(gè)字節(jié)都對(duì)應(yīng)一個(gè)編號(hào)(就好比酒店中設(shè)有很多間客房,每間客房都有對(duì)應(yīng)的房牌號(hào)),此編號(hào)就是變量在內(nèi)存中的存儲(chǔ)地址。指針就是用來表示這些地址的變量。簡(jiǎn)單地說,指針就是地址。例如:int x;int *point;point=&x;;表示point為指針變量,存放變量x的地址;x就是指針變量point所指向的變量。假設(shè)x的地址為2016,則point所存儲(chǔ)的地址即為2016。很多學(xué)生最初都存在這樣的疑問:若2016是變量x的地址,那么要表示指針point存放變量x的地址是否可以這樣賦值:point=2016。這是錯(cuò)誤的,這個(gè)賦值語句中的2016表示是一個(gè)整型數(shù)據(jù),不能表示地址。對(duì)于指針變量的賦值只能用取地址運(yùn)算符"&"進(jìn)行賦值,即:point=&x;;&x;表示變量x的地址。初學(xué)者還需注意:指針必須先賦值后使用,指針指向的變量類型必須和指針類型一致。
2 區(qū)分定義指針變量的*和指針運(yùn)算符*
定義指針變量語句中的*是對(duì)指針變量的說明,如int *point表示定義point是一個(gè)指向int類型的指針變量。
指針運(yùn)算符*是一個(gè)單目運(yùn)算符,必須和指針變量結(jié)合表示間接訪問該指針指向的對(duì)象。如int x=50,*point=&x;;*point=60;第1個(gè)*表示定義point是一個(gè)指向x的指針變量,第2個(gè)*和指針共同組成表達(dá)式*point表示間接訪問x,相當(dāng)于給x重新賦值為60。
3 指針與數(shù)組
一個(gè)數(shù)組由若干個(gè)元素組成,每個(gè)元素都對(duì)應(yīng)一個(gè)地址,C語言中定義數(shù)組的指針,是指向整個(gè)數(shù)組的起始地址,和數(shù)組名表示的地址相同。數(shù)組元素的指針是數(shù)組元素的地址。例如:char s[10];char *p;這里的數(shù)組名s就是數(shù)組的首地址,若賦值p=s,則p為指向數(shù)組s的指針,表示整個(gè)數(shù)組的首地址,s+3表示距離s后3個(gè)位置所在單元的地址。s[3]表示數(shù)組中第4個(gè)元素的值,即距離s后3個(gè)位置所在單元中的值,因此s[3]與*(s+3)等價(jià)。由于p也表示數(shù)組的首地址,p+3與s+3等價(jià),因此p[3]與*(p+3)、s[3]、*(s+3)等價(jià)。需要注意的是,p是允許移動(dòng)的,如p=p+2,表示p發(fā)生改變,變?yōu)橹赶蛟豷[2]的地址,此時(shí)p[3]、*(p+3)不再表示s[3]的值,而是與s[5]等價(jià)。而此例中的s只能表示數(shù)組的首地址,不能出現(xiàn)這樣的賦值:s=s+2。
4 指針與函數(shù)
在指針與函數(shù)的關(guān)系中,有函數(shù)指針、指針函數(shù)、指針作為函數(shù)參數(shù)的三種常用形式。
(1)函數(shù)指針
函數(shù)指針是指向函數(shù)起始地址的指針,定義格式是:類型名 (*指針變量名)( );由于函數(shù)是一個(gè)整體,函數(shù)指針不能做自增、自減運(yùn)算。
(2)指針函數(shù)
指針函數(shù)是表示指針的函數(shù),其本質(zhì)是一個(gè)函數(shù),返回值是某一類型的指針,定義格式是:類型名 *函數(shù)名(參數(shù)列表);由于返回值是地址,因此類型一般都定義為int。
(3)指針作為函數(shù)的參數(shù)
函數(shù)的參數(shù)可以為字符型、整型、浮點(diǎn)型等數(shù)據(jù),也可以是指針類型,它的作用是將變量的地址傳遞到另一個(gè)函數(shù)中。
例如,有兩個(gè)整型變量,m的值為55,n的值為66,若要交換m、n的值,使得m的值為66,n的值為55。首先我們以傳值的方式構(gòu)建函數(shù):
Void func_val(int x,int y)
{
t=x;
x=y;
y=t;
}
在調(diào)用函數(shù)func_val(m,n)后,發(fā)現(xiàn)m、n的值并沒有被交換。因?yàn)楹瘮?shù)調(diào)用時(shí),將實(shí)參的值傳遞給形參,函數(shù)最終交換的值是形參x、y的值,并不是實(shí)參m、n的值。
要想使函數(shù)對(duì)兩個(gè)實(shí)參進(jìn)行交換,必須使實(shí)參與賦值后的形參變量所處的地址是相同的??梢砸灾羔樀男问阶鳛樾螀⒅匦聵?gòu)建函數(shù):
Void func_addr(int *p,int *q)
{
t=*p;
*p=*q;
*q=t;
}
在調(diào)用函數(shù)時(shí),必須將m、n地址傳遞給以指針形式表示的形參p、q,調(diào)用表達(dá)式應(yīng)為func_addr(&m;,&n;),調(diào)用之后實(shí)參m、n的值被交換了。通過此例可以看出,指針作為形參可以改變實(shí)參的值,使函數(shù)構(gòu)建的功能更加模塊化。在C語言程序設(shè)計(jì)過程中,指針可能是實(shí)現(xiàn)某些算法的唯一方法。
5 結(jié)束語
C語言程序設(shè)計(jì)是國(guó)內(nèi)外大學(xué)計(jì)算機(jī)課程中重要的課程之一,指針是該課程中非常重要的部分,也是難點(diǎn)之一。在理論學(xué)習(xí)了指針的各知識(shí)點(diǎn)后,還應(yīng)鼓勵(lì)學(xué)生在課后要多思考、多編程、多實(shí)踐。
參考文獻(xiàn):
[1]楊智明.C語言指針使用分析[J].保山學(xué)院學(xué)報(bào),2012.