在C語言中,數(shù)組與指針的關(guān)系十分密切。要想有效地使用數(shù)組,您需懂得如何借助指針。而做到將二者的關(guān)系了如指掌,恐怕得花上數(shù)天的時間學習和試驗,但這種努力決不會白費。
讓我們從一個C數(shù)組的簡單例子開始:
#define MAX 10
int main()
{
int a[MAX];
int b[MAX];
int i;
for(i=0; i
a[i]=i;
b=a;
return 0;
}
錄入上面的代碼并編譯。您會發(fā)現(xiàn)代碼不能編譯。如果要將a復制給b,您需要像下面這樣寫:
for (i=0; i
b[i]=a[i];
或更簡練地寫為:
for (i=0; i
更好的方法是使用string.h中的memcpy函數(shù)。
從技術(shù)上說,變量a和b本身并不是數(shù)組,這是C語言中數(shù)組的不尋常之處。它們其實是指向數(shù)組的固定指針。a和b永久指向各自數(shù)組的第一個元素——它們保存的分別是a[0]和b[0]的地址。既然是固定指針,您就不能修改它們保存的地址。因此不能用a=b;這樣的語句。
因為a和b是指針,您可以用指針和數(shù)組做一些有意思的事情。例如,下面的代碼是正確的:
#define MAX 10
void main()
{int a[MAX];int i;int *p;
p=a;for(i=0; i
printf("%d
p=a;p=a;這條語句是合法的,因為a是一個指針。嚴格地說,a指向?qū)嶋H數(shù)組的第0號元素的地址。此元素為一整數(shù),故a是一個指向單一整數(shù)的指針。因此,可以聲明p為一個指向整數(shù)的指針并令其等于a。用p=&a[0];替換p=a;是完全等價的。因為a保存的是a[0]的地址,所以a和&a[0]是相同的。
下圖顯示了剛好在for循環(huán)開始執(zhí)行之前的變量狀態(tài):
?
? |
?
現(xiàn)在既然p指向了a的0號元素,您可以進行一些特別的操作。變量a是一個不可修改的固定指針,而p卻不受這種限制。其實C鼓勵您利用指針運算來移動p。例如,如果您寫p++;,而編譯器知道p指向一個整數(shù),所以p就會被增加適當?shù)淖止?jié),移動到指向數(shù)組的下一個元素。如果p原來指向的數(shù)組元素是100個字節(jié)大小的結(jié)構(gòu)體,p++;會將p移動100個字節(jié)。C會自動處理元素大小的細節(jié)。
您也可以使用指針將數(shù)組a復制給b。下面的代碼可以用來代替
(for i=0;i
p=a;q=b;
for (i=0; i
{*q = *p;q++;p++;}
以上代碼可以簡化為:
p=a;
q=b;
for (i=0; i
*q++ = *p++;
并進一步簡化為:
for (p=a,q=b,i=0; i
指針p或q在數(shù)組a或b中越界了怎么辦?C才不管——它會繼續(xù)漫不經(jīng)心地遞增p和q,肆無忌憚地邊復制邊覆蓋掉別的變量。C會將數(shù)組越界認為是程序員有意為之,因此在訪問數(shù)組時需要謹慎。
有兩種方式可將一個數(shù)組(如a或b)傳給函數(shù)。假設(shè)某dump函數(shù)接受一個整型數(shù)組為參數(shù)并將數(shù)組內(nèi)容在標準輸出上打印。這兩種編寫dump的方式為:
void dump(int a[],int nia)
{int i;for (i=0; i
printf("%d
或:
void dump(int *p,int nia)
{int i;for (i=0; i
printf("%d
變量nia(number_in_array,數(shù)組元素數(shù)目)用于確定數(shù)組的大小。請注意傳入函數(shù)的只是一個指向數(shù)組的指針,而不是數(shù)組的內(nèi)容。另外請注意,C函數(shù)能接受可變大小的數(shù)組作為參數(shù)。
評論