姜雪茸
摘 要:本文從指針的基本概念出發(fā),分別闡述了指針、指針變量、指針與數(shù)組、指針與函數(shù)等幾個(gè)方面的基本概念。
關(guān)鍵詞:C語(yǔ)言;指針;數(shù)組;函數(shù)
1 指針
理解指針首先要了解內(nèi)存,掌握內(nèi)存單元、內(nèi)存單元的地址、內(nèi)存單元的內(nèi)容的基本概念。內(nèi)存是由許多個(gè)大小完全一致的存儲(chǔ)單元構(gòu)成。每一個(gè)存儲(chǔ)單元容量為一個(gè)字節(jié)。為將各存儲(chǔ)單元區(qū)別開(kāi),給每個(gè)存儲(chǔ)單元一個(gè)對(duì)應(yīng)的編號(hào)稱為存儲(chǔ)單元的地址。而存儲(chǔ)單元中存儲(chǔ)的數(shù)據(jù)稱為存儲(chǔ)單元的內(nèi)容。
在計(jì)算機(jī)中,所有數(shù)據(jù)都被放在內(nèi)存中。如果在程序中定義了一個(gè)變量,則程序在編譯過(guò)程中由系統(tǒng)給變量分配適當(dāng)內(nèi)存單元。因此,在程序中使用的變量就是內(nèi)存中某個(gè)存儲(chǔ)單元。例如,程序中定義某字符型變量i=A,編譯時(shí)為其分配地址為2000的一個(gè)存儲(chǔ)單元。則變量i被存放在地址編號(hào)為2000的單元中,此單元中存放的內(nèi)容是A。地址指示出變量所在位置,即按變量地址尋找變量的值,變量的地址就稱為變量的指針。通常用&表示取變量的存儲(chǔ)地址,&i=2000。
2 指針變量
如果將變量i所在單元的地址2000作為數(shù)據(jù)存放在其他存儲(chǔ)單元中(假設(shè)當(dāng)前分配其他單元地址為3000),則變量i被存放在以地址編號(hào)為3000的存儲(chǔ)單元的內(nèi)容2000為地址的單元中。即就是存儲(chǔ)單元3000中存放的是變量i的地址(或指針),則將存儲(chǔ)單元3000定義為變量稱為指針變量,專門用來(lái)存放變量存儲(chǔ)地址的變量稱為指針變量。通常用*表示變量的類型為指針型變量。
3 指針與數(shù)組
3.1 指針和一維數(shù)組
數(shù)組是同類型數(shù)據(jù)的有序集合。數(shù)組中的元素依次順序的存儲(chǔ)在一片連續(xù)的內(nèi)存區(qū)域中,對(duì)數(shù)組的操作依靠數(shù)組元素的下標(biāo)實(shí)現(xiàn),而數(shù)組下標(biāo)代表的是數(shù)組元素所在地址,地址即指針。所以用指針不但可以實(shí)現(xiàn)數(shù)組的操作,而且占用內(nèi)存少,運(yùn)行速度快。
3.2 指針和二維數(shù)組
二維數(shù)組由若干個(gè)一維數(shù)組組成。C語(yǔ)言將二維數(shù)組實(shí)際上定義為一個(gè)一維數(shù)組,而這個(gè)一維數(shù)組的每一個(gè)成員又是一個(gè)一維數(shù)組。假設(shè)定義int *p,a[3][4],i,j;則a數(shù)組由a[0]、a[1]、a[2]三個(gè)元素組成,而a[0]、a[1]、a[2]每個(gè)元素又分別是由4個(gè)整型元素組成的一維數(shù)組。a[0]、a[1]、a[2]依次代表二維數(shù)組每行第一個(gè)元素的地址,二維數(shù)組元素的地址可以由表達(dá)式&a[i][j]求得,或通過(guò)每行的首地址來(lái)表示。如:地址&a[0][0]可以用a[0]+0來(lái)表示,地址&a[0][1]可以用a[0]+1表示;則a[i][j]的地址可用五種方式表示:(1)&a[i][j](2)a[i]+j(3)*(a+i)+j(4)&a[0][0]+4*i+j (5)a[0]+ 4*i+j。由以上通過(guò)地址來(lái)引用二維數(shù)組元素a[i][j]對(duì)應(yīng)有五種方式表達(dá):(1)a[i][j](2)*(a[i]+j)(3)*(*(a+i)+j)(4)(*(a+i))[j](5)*(&a[0][0]+4*i+j)。
4 指針與函數(shù)
4.1 函數(shù)指針
指針可以指向整型變量、字符串、數(shù)組、也可以指向一個(gè)函數(shù)。一個(gè)函數(shù)在編譯是被分配給一個(gè)入口地址。這個(gè)函數(shù)的入口地址就稱為函數(shù)的指針。即用一個(gè)指針變量指向函數(shù),然后通過(guò)該指針變量調(diào)用此函數(shù)。例如:int(*p)(int,int);表示定義了一個(gè)指向函數(shù)的指針變量p,p用來(lái)存放函數(shù)入口地址。若當(dāng)前有函數(shù)int proc(int,int);則p=proc是將函數(shù)proc的入口地址賦給p,而用函數(shù)指針變量調(diào)用函數(shù)時(shí),將(*p)代替函數(shù)名,可以表示為c=(*p)(a,b),其中a,b為實(shí)參。
函數(shù)指針變量通常是用于把指針作為參數(shù)傳遞到其他函數(shù)。函數(shù)的參數(shù)可以是多種類型的變量,指向函數(shù)的指針也可以作為參數(shù)實(shí)現(xiàn)函數(shù)地址的傳遞,從而實(shí)現(xiàn)在被調(diào)用的函數(shù)中使用實(shí)參函數(shù)。例如:某程序中函數(shù)聲明為void subproc(int,int,int(*subfun)(int,int));函數(shù)調(diào)用為subproc(s,t,suba);subproc(s,t,subb);subproc(s,t,subc);其中int(*subfun)(int,int)表示subfun是指向函數(shù)的指針,它在程序中多次被調(diào)用,將函數(shù)suba,subb,subc作為實(shí)參分別傳遞給形參subfun。也就是將函數(shù)指針?lè)謩e指向suba,subb,subc三個(gè)子函數(shù)。實(shí)現(xiàn)了函數(shù)的多次調(diào)用,而無(wú)需定義多個(gè)實(shí)參,增加了程序的靈活性,簡(jiǎn)化了程序。
函數(shù)指針本質(zhì)是一個(gè)指針。
4.2 指針函數(shù)
指針函數(shù)本質(zhì)是一個(gè)函數(shù)。
一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址。例如:int *a(int x,int y);其中函數(shù)名和參數(shù)為a(int x,int y),在函數(shù)名前加上*表示此函數(shù)為指針型函數(shù)。最前面的int表示返回的指針指向整型變量。
5 指針數(shù)組與指向指針的指針
5.1 指針數(shù)組
一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組。指針數(shù)組中的每一個(gè)元素均為指針。指針數(shù)組可以作為函數(shù)的參量使用,也常用于指向若干字符串,這樣使字符串處理更加靈活方便。
5.2 指向指針的指針
一個(gè)指針變量指向其他指針類型變量,稱為指向指針的指針。
例如:int i,*p1,**p2;p1=&i;p2=&p1;*p1=i;*p2=p1;則p2=&(&i);**p2=i;
一個(gè)指針變量的地址就是指向該變量的指針,也稱為雙重指針。例如:int **a [n]
這是一個(gè)int型指針的指針數(shù)組。a首先和[ ]結(jié)合,即a[n],表示a是一個(gè)數(shù)組,然后a[n]和其緊鄰的*結(jié)合,即*a[n],表示數(shù)組a的每個(gè)元素均為指針。*a[n]再和前一個(gè)*結(jié)合(*的結(jié)合順序?yàn)閺挠业阶螅?,?(*a[n]),表示數(shù)組a的每個(gè)元素為指針,且該指針指向int型的指針,也就是說(shuō),數(shù)組a的每個(gè)元素為int型的指針的指針。
[參考文獻(xiàn)]
[1]譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)(第三版)[M].清華大學(xué)出版社,2005.
[2]衛(wèi)武波,陳冬.C語(yǔ)言指針解析[J].《軟件導(dǎo)刊》,2012(11).