C專家程式設計 十二 C語言的多維陣列

2021-07-24 14:10:43 字數 2668 閱讀 1419

有些人聲稱c語言沒有多維陣列,這是不對的。ansi c標準在第6.5.4.2節以及第69號腳注上表示:

當幾個「」修飾符連續出現時(方括號裡面是陣列的範圍),就是定義乙個多維陣列。

但所有其他語言都把這稱為「陣列的陣列」

c語言的方法多少有點獨特:定義和引用多維陣列惟一的方法就是使用陣列的陣列。儘管c語言把陣列的陣列當作是多維陣列,但不能把幾個下標範圍如[i][j][k]合併成pascal式的下標表示式風格如[i,j,k]。如果你清楚地明白自己在做什麼,也介意產生不合規範的程式,可以把[i][j][k

]這樣的下標值計算為相應的偏移量,然後只用乙個單一的下標[z]來引用陣列。當然這不是一種值得推薦的做法。同樣糟糕的是,像[i,j,kl這樣的下標形式(由逗號分隔)是c語言合法的表達形式,只是它並非同時引用這兒個下標(它實際上所引用的下標值是k, 也是就逗號表示式的值)。c語言支援其他語言一般稱作「陣列的陣列」的東西,但卻稱它為多維陣列,這樣就模糊了兩者的邊界,使許多人對兩者混淆不清。

儘管術語上稱作「多維陣列」,但c語言實際上只支援「陣列的陣列」。如果在你的思維 模式中,把陣列看作是一坤向量(即某種物件的一維陣列,它的元素可以是另乙個陣列),就能極大簡化程式語言中這個相當複雜的領域。

如何分解多維陣列

必須仔細注意多維陣列是如何分解為幾個單獨的陣列的。如果我們宣告如下的多維陣列:

int apricot [21 [3 j [5];

可以按圖9-8所示的任何一種方法為它在記憶體中定位

正常情況下,賦值發生在兩個相同的型別之間,如int與int、double與double等。在圖 9-8中,可以看到在「陣列的陣列的陣列」中的每乙個單獨的陣列都可以看作是乙個指標。 這是因為在表示式中的陣列名被編譯器當作「指向陣列第乙個元素的指標」(第242頁的規則 1)。換句話說,不能把乙個陣列賦值給另乙個陣列,因為陣列作為乙個整體不能成為賦值的 物件。可以把陣列名賦值給乙個指標,就是因為這個「在表示式中的陣列名被編譯器當作一 個指標」的規則。

指標所指向的陣列的維數不同,其區別會很大。使用上面例子中的宣告:

r++;

t++;

將會使r和t分別指向它們各自的下乙個元素(兩者所指向的元素本身都是陣列)。它們所增長的步長是很不相同的,因為r所指向的陣列元素的大小是t所指向的陣列的元素大小的三倍。

記憶體中陣列是如何布局的

在c語言的多維陣列中,最右邊的下標是最先變化的,這個約定被稱為「行主序」。由 於「行/列主序」這個術語只適用於恰好是二維的多維陣列,所以更確切的術語是「最右的下 標先變化」。絕大部分語言都採用了這個約定,但fortran卻是乙個主要的例外,它採用了「最左的下標先變化」,也就是「列主序」。在不同的下標變化約定中,多維陣列在記憶體中的布局也不相同。事實上,如果把乙個c語言的矩陣傳遞給乙個fortran程式,矩陣就會被自動轉置——這是乙個非常厲害的邪門密技,偶爾真還會用到。

c語言中多維陣列最大的用途是儲存多個字串。有人指出「最右邊的下標先變化」在 這方面具有優勢(每個字串中相鄰的字元在記憶體中也相鄰儲存)。但在「最左邊的下標先變化」的多維陣列(如fortran)中,情況並不如此。

如何對陣列進行初始化

在最簡單的情況下,一維陣列可以通過把初始值都放在一對花括號內來完成初始化。如果在陣列的定義裡未標明它的長度,c語言約定按照初始化值的個數來確定陣列的長度。

f1oat banana[5] = ;

float honeydew [ ] = ;

只能夠在陣列宣告時對它進行整體的初始化。之所以存在這個限制,並沒得過硬的理由。 多維陣列可以通過嵌奪的花括號進行初始化:

short cantaloupe[2][5] = ,

,

};

int rhubarb [3]=, 

,

};

注意,可以在最後乙個初始化值的後面加乙個逗號,也可以省略它。同時,也可以省略最左邊下標的長度(也只能是最左邊的下標),編譯器會根據初始化值的個數推斷出它的長度。

如果陣列的長度比所提供的初始化值的個數要多,剩餘的幾個元素會自動設定為0。如果元素的型別是指標,那麼它們被初始化為null;如果元素的型別是float,那麼它們被初 始化為0.0。在流行的ieee 754標準浮點數實現中(ibm pc和sun系統都使用了這個標準),

0.0和0的位模式是完全一祥的。

C語言的簡單使用(十二 多維陣列)

先說一下,這裡的多維陣列是指二維往上,包括二維的陣列,這些知識在程式設計的過程中幾乎用不到,但是它能更好地幫助程式設計師理解變數在記憶體中的分布。首先,乙個陣列就是相同型別的變數的有序集合,跟鍊錶的重要區別就是,陣列有序且順序不可更改 a i 後跟著的必定是 a i 1 其次,陣列本質上還是記憶體中...

C語言陣列之多維陣列

多維陣列 可以理解為存放陣列的陣列 以宿舍或公寓為例 元素 就是乙個乙個房間 1001 一層 相當於是一維陣列 一棟樓 就相當於二維陣列 乙個園區 就相當於三維陣列 乙個高教區 就相當於四位陣列 乙個城市 就相當於五維陣列 多維陣列定義演示 int arr 10 10 10 10 10 10 pri...

C語言基礎 多維陣列

今天我們來學習陣列的另一種用高階用法,多維陣列。多維陣列的定義與使用與數學定義一致,它可以表示多維的數值。一 二維陣列 例如我們先來定義乙個二維陣列 int array 3 4 我們可以像上面例子一樣在陣列定義時為其指定初始值,也可以在陣列定義之後再為其賦值。上面例子中我們定義了乙個具有3行的陣列,...