C語言的二維陣列模擬

2021-06-21 14:08:42 字數 2186 閱讀 7474

從前面的討論中,我們不難得出乙個推論,*a即陣列a中下標為0的元素的引用。例如,我們可以這樣寫:

1*a=84;

這個語句將陣列a中下標為0的元素的值設定為84.同樣道理,*(a+1)陣列a中下標為1的的元素的引用,以此類推,概而言之,*(a+i)即陣列中下標為i的元素的引用,這種寫法是如此常用,因此被簡記為a[i].

正是這一概念讓c語言新手難於理解,實際上,由於a+i與i+a的含義一樣,因此a[i]和i[a]也具有同樣的含義。也許某些組合語言程式設計師會發現後一種寫法很熟悉,但我們絕對不推薦這種寫法。

現在我們可以考慮二維陣列了,正如前面所討論的,它實際上是以陣列為元素的陣列,儘管我們也可以完全依據指標編寫操縱一維陣列的程式,這樣做在一維情形下並不困難,但是對於二維陣列從記法上的便利性來說採用下述形式就幾乎是不可替代了。還有,如果我們僅僅使用指標來操縱二維陣列,我們將不得不與c語言中最為「晦暗不明」的部分打交道,並常常遭遇到潛伏著的編譯器bug。

讓我們回過頭來再看前面的幾個宣告:

1int calendar[12][31];

2int *p

3int i;

然後考一考自己,calendar[4]的含義是什麼?

因為calendar是乙個有著12個陣列型別元素的陣列,它的每個陣列型別元素又是乙個有著31個整型陣列,所以calendar[4]是 calendar陣列的第五個元素,是calendar陣列中12個有著31個整型元素的陣列之一,因此calendar[4]的行為也就表現乙個有著31個整形元素的陣列的行為,例如sizeof(calendar[4])的結果是31與sizeof(int)的乘積。

1p=calendar[4];

這個語句使指標p指向了陣列calendar[4]中下標為0的元素。如果calendar[4]是乙個陣列,我們當然可以通過下標的形式來指定這個陣列中的元素,就像下面這樣:

1i = calendar[4][7];

我們確實也可以這樣做。還是與前面類似的道理,這個語句可以寫成下面這樣而表示式的意思保持不變:

1i = *(calendar[4]+7);

這個語句還可以進一步寫成:

1i = *(*(calendar+4)+7);

從這裡我們不難發現,用方括號的下標形式很明顯地要比指標來表達簡便得多。下面我們再看:

1p = calendar;

這個語句是非法的,因為calendar是乙個二維陣列,即陣列的陣列,在此處的上下文中使用calendar名稱會將其轉化為乙個指向陣列的指標,而p是乙個指向整型變數的指標,這個語句試圖將乙個型別的指標賦值給另一種型別的指標,所以是非法的。

很顯然,我們需要一種宣告指向陣列的指標的方法,經過了前面對類似問題不厭其煩的討論,構造出下面的語句應該不需要廢多大力氣:

1int (*ap)[31];

這個語句的效果是,宣告了*ap是乙個擁有三十乙個整型元素的陣列ap就是乙個指向這樣的陣列的指標,因而我們可以這樣寫:

1int(*monthp)[31];

2monthp = calendar;

這樣,monthp將指向陣列calendar的第乙個元素,也就是陣列calendar的12個有著31個元素的陣列型別元素之一。

假定在新的一年開始時,我們需要清空calendar陣列,用下標形式可以很容易做到:

1int month;23

for(month=0;month < 12;month++)

上面的**段如果才用指標應該如何表示呢?我們很容易地把 calendar[month][day]=0; 表示為*(*(calendar+month)+day)=0;

但是真正有關的部分是哪些呢?

如果指標monthp指向乙個擁有31個整型元素的陣列,而calendar的元素也是乙個擁有31個整型元素的陣列,因此就像是在其他情況中我們可以使用乙個指標遍歷乙個陣列一樣,這裡我們同樣可以使用指標monthp以步進的方式遍歷陣列calendar:

1int (*monthp)[31];

2for(monthp=calendar;monthp < &calendar[12];monthp++)

到目前為止,我們一路行來幾乎是「如履薄冰」,而且已經走得很遠,在我們跌跤之前,最好趁早懸崖勒馬。儘管本節中最後乙個例子是合法的ansi c程式,但是作者還有找到乙個能夠讓該程式順利通過編譯的編譯器(譯註:現在大多數的c編譯器能夠接受上面例子中的**)。上面例子的討論雖然有些偏離本書的主題,但是這個例子能夠很好地揭示出c語言中陣列與指標之間的獨特的關係,從而更清楚明白地闡述這兩個概念。

C語言二維陣列

int main int argc,const char argv int array 5 建立乙個二維陣列 型別修飾符陣列名 包含幾個小陣列 每個小陣列有多少個元素 初始值如何寫?int array 3 4 一維陣列可以省略元素個數,二維陣列只能省略第一位 第乙個 3 可以不寫 第二種初始值寫法 ...

C語言 二維陣列

c語言之二維陣列 1 定義的基本格式 int a 1 2 1代表一行,2代表二列 難點 二維陣列的行列下標。字串結束標誌的實用。2 一維陣列和二維陣列的聯絡。一維陣列如同千層面一樣一層一層的,而二維陣列,只是給千層面切了幾刀 3 int a 2 3 a 0 0 是1,a 0 1 是2,a 0 2 是...

C語言 二維陣列

1 陣列名稱不可以代表儲存區 2 陣列名稱可以代表陣列裡第乙個儲存區的位址 3 可以對陣列名稱進行sizeof計算,結果是陣列裡所有儲存區的總大小 4 c99規範裡可以使用變長陣列,宣告變長陣列的時候可以用變數表示陣列裡的儲存區個數 5 某一次程式執行過程中變長陣列裡儲存區個數不會變化 6 如果程式...