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