C語言入門教程 在C語言中,,數(shù)組與指針的關(guān)系十分密切。要想有效地使用數(shù)組,,您需懂得如何借助指針,。而做到將二者的關(guān)系了如指掌,恐怕得花上數(shù)天的時間學(xué)習(xí)和試驗,,但這種努力決不會白費,。 讓我們從一個C數(shù)組的簡單例子開始: #define MAX 10
int main() 錄入上面的代碼并編譯。您會發(fā)現(xiàn)代碼不能編譯,。如果要將a復(fù)制給b,,您需要像下面這樣寫:
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()
p=a;for(i=0; i p=a;p=a;這條語句是合法的,因為a是一個指針,。嚴(yán)格地說,,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號元素,,您可以進(jìn)行一些特別的操作,。變量a是一個不可修改的固定指針,而p卻不受這種限制,。其實C鼓勵您利用指針運算來移動p,。例如,如果您寫p++;,,而編譯器知道p指向一個整數(shù),,所以p就會被增加適當(dāng)?shù)淖止?jié),移動到指向數(shù)組的下一個元素,。如果p原來指向的數(shù)組元素是100個字節(jié)大小的結(jié)構(gòu)體,,p++;會將p移動100個字節(jié)。C會自動處理元素大小的細(xì)節(jié),。
您也可以使用指針將數(shù)組a復(fù)制給b,。下面的代碼可以用來代替
p=a;q=b; 以上代碼可以簡化為:
p=a;
并進(jìn)一步簡化為: 指針p或q在數(shù)組a或b中越界了怎么辦?C才不管——它會繼續(xù)漫不經(jīng)心地遞增p和q,,肆無忌憚地邊復(fù)制邊覆蓋掉別的變量,。C會將數(shù)組越界認(rèn)為是程序員有意為之,因此在訪問數(shù)組時需要謹(jǐn)慎,。 有兩種方式可將一個數(shù)組(如a或b)傳給函數(shù),。假設(shè)某dump函數(shù)接受一個整型數(shù)組為參數(shù)并將數(shù)組內(nèi)容在標(biāo)準(zhǔn)輸出上打印。這兩種編寫dump的方式為:
void dump(int a[],int nia) 或:
void dump(int *p,int nia) 變量nia(number_in_array,,數(shù)組元素數(shù)目)用于確定數(shù)組的大小,。請注意傳入函數(shù)的只是一個指向數(shù)組的指針,而不是數(shù)組的內(nèi)容,。另外請注意,,C函數(shù)能接受可變大小的數(shù)組作為參數(shù)。 |
|