第 12 講:二維數(shù)組
前文我們講到了一維數(shù)組的基本賦值方式和使用方式,但基本上我們可以看到,如果不是迫不得已的情況下,貌似一維數(shù)組已經(jīng)夠用了,不過為了教程的完整性,我們還是把一些其它情況,必須要更高維的數(shù)組的時(shí)候,它們的語法格式講一下。今天說的是二維數(shù)組。
二維數(shù)組的定義
當(dāng)我們?cè)谌藶槎x的情況下必須要使用兩個(gè)維度(行和列)的時(shí)候,就不得不使用二維數(shù)組來定義,比如一個(gè)表格。比如,我們需要一個(gè) 3 行 4 列的表格,它的定義方式是這樣的:
此時(shí),我們需要在定義語句里寫上兩個(gè)中括號(hào),一個(gè)表示行,一個(gè)表示列。這個(gè)地方的定義就表示一個(gè)二維數(shù)組是 3 行 4 列的。同時(shí)請(qǐng)你繼續(xù)注意的地方是,這里的中括號(hào)是定義語句里用的,所以它表示這個(gè)數(shù)組是多少行多少列的,而并非取出第 3 行第 4 列的數(shù)據(jù)。請(qǐng)你注意這一點(diǎn)。
你也可以理解為,
table
變量一共有三個(gè)元素構(gòu)成,每一個(gè)元素都是一個(gè)需要 4 個(gè)元素的數(shù)組構(gòu)成的一維數(shù)組序列。所以這種理解方式更類似于“是一個(gè)一維數(shù)組,只是每一個(gè)數(shù)據(jù)的類型是一個(gè)一維數(shù)組,即數(shù)組的數(shù)組”。
初始化賦值
在二維數(shù)組里,初始化賦值就比較麻煩了。比如,一種簡(jiǎn)單的賦值方式是采取“數(shù)組的數(shù)組”的理解方式來賦值的,比如這樣:
存四個(gè) int
類型元素的一維數(shù)組
注意,這種設(shè)計(jì)是為了保證后續(xù)可以完整取出具體位置的元素而設(shè)計(jì)的。
數(shù)組在內(nèi)存里的表達(dá)實(shí)際上都是一個(gè)一維數(shù)組。顯然,內(nèi)存是一個(gè)長(zhǎng)條分布的形狀,所以不管多少維度的數(shù)組,哪怕后面用到的更高維度的數(shù)組,在內(nèi)存里都只可能表示成一個(gè)一維的數(shù)組形式,而一個(gè)二維數(shù)組需要列元素的個(gè)數(shù)這一個(gè)信息來正確分割整個(gè)數(shù)組,來保證二維數(shù)組的成立。如果你省略了列元素的個(gè)數(shù),我們就無法在正確的地方斷開這個(gè)數(shù)組,進(jìn)而得不到正確結(jié)果。比如,一個(gè)數(shù)組擁有 12 個(gè)元素(3 行 4 列),那么它在內(nèi)存里只能表示成這樣:

這個(gè)表達(dá)形式可以看到,我們?yōu)橐粋€(gè)一維數(shù)組進(jìn)行正確的定界是必須要列元素?cái)?shù)這個(gè)信息的。所以列元素總數(shù)這個(gè)數(shù)字是不可以省略的。
另外,二維數(shù)組也可以省略一些元素的賦值,此時(shí)將會(huì)默認(rèn)賦值 0:
這樣的話,整個(gè)數(shù)組的賦值的情況就是

當(dāng)然,內(nèi)部的大括號(hào)都可以被省略,但這個(gè)時(shí)候就不能省略中間的元素了:
和上面的邏輯一樣,這個(gè)賦值方式依然是滿足要求的,這樣就可以看出賦值語句里列元素?cái)?shù)這個(gè)信息的重要性了。
當(dāng)然,它也可以不完全賦值:
那么,從第十個(gè)元素開始(從 0 開始算就是第 9 號(hào)元素)都被賦值為 0。
二維數(shù)組存取數(shù)值
按照 C 語言的規(guī)定,數(shù)組的索引從 0 開始(所謂的索引,就是取值和存值的那個(gè)中括號(hào)里的數(shù)值,它可以表示這個(gè)數(shù)組的第幾個(gè)元素,這個(gè)數(shù)就是索引,有時(shí)候也稱為下標(biāo),Index),所以二維數(shù)組的兩個(gè)維度都是從 0 開始。
不過,二維數(shù)組需要兩個(gè)索引,一個(gè)行索引,一個(gè)列索引:
那么,要取出第 10 個(gè)元素 5,應(yīng)如何寫呢?
即第 2 行第 1 列的元素(注意,這個(gè)索引數(shù)值是從 0 開始,所以第 2 行就是我們?nèi)藶槔斫獾牡谌?,而?1 列就是我們理解的第二列),第三行第二列就是 5 了。
另外,初始化賦值可以這么寫:
for
循環(huán)的條件 i < 3
和 j < 4