為了讓大家更好地學(xué)習(xí)和理解數(shù)組,我們先來認(rèn)識(shí)一下內(nèi)存中的"地址"。
地址
1.計(jì)算機(jī)中的內(nèi)存是以字節(jié)為單位的存儲(chǔ)空間。
? ? ? ?內(nèi)存的每一個(gè)字節(jié)都有一個(gè)唯一的編號(hào),這個(gè)編號(hào)就稱為地址。凡存放在內(nèi)存中的程序和數(shù)據(jù)都有一個(gè)地址,也就是說,一個(gè)函數(shù)也有自己的內(nèi)存地址。
2.當(dāng)定義一個(gè)變量時(shí),系統(tǒng)就分配一個(gè)帶有唯一地址的存儲(chǔ)單元來存儲(chǔ)這個(gè)變量。比如:
chara ='A';? ?// A的ASCII值為65
intb =66;
? ? ? ?在16bit編譯器環(huán)境下,系統(tǒng)為a、b分別分配1個(gè)字節(jié)、2個(gè)字節(jié)的存儲(chǔ)單元。變量存儲(chǔ)單元的第一個(gè)字節(jié)的地址就是該變量的地址。

? ? ? ?可以看出,變量a的地址是ffc3;變量b的地址是ffc1。內(nèi)存中存儲(chǔ)的都是2進(jìn)制數(shù)據(jù)。
3.在調(diào)試過程中,我們采取打印的方式查看變量的地址:

輸出結(jié)果:

一、一維數(shù)組
1.一維數(shù)組的定義
??定義的形式為:類型? 數(shù)組名[元素個(gè)數(shù)]
inta[5];
??[]只能放在數(shù)組名的后面,下面的都是錯(cuò)誤寫法:
int[5] a;? ?// 錯(cuò)誤
int[] b;? ?// 錯(cuò)誤
??[]里面的個(gè)數(shù)必須是一個(gè)固定值,可以是常量(比如6、8)、常量表達(dá)式(比如3+4、5*7)。絕對(duì)不能使用變量或者變量表達(dá)式來表示元素個(gè)數(shù),大多數(shù)情況下不要省略元素個(gè)數(shù)(當(dāng)數(shù)組作為函數(shù)的形參和數(shù)組初始化時(shí)除外)
下面的都是正確寫法:
? ? ? ?inta[5];// 整型常量
? ? ? ?intb['A'];// 字符常量,其實(shí)就是65
? ? ? ?intc[3*4];// 整型常量表達(dá)式
下面的都是錯(cuò)誤寫法:
? ? ? ?inta[];? ? // 沒有指定元素個(gè)數(shù),錯(cuò)誤
? ? ? ?inti =9;
? ? ? ?inta[i];? ?// 用變量做元素個(gè)數(shù),錯(cuò)誤
2.一維數(shù)組的存儲(chǔ)
定義數(shù)組時(shí),系統(tǒng)將按照數(shù)組類型和個(gè)數(shù)分配一段連續(xù)的存儲(chǔ)空間來存儲(chǔ)數(shù)組元素,如int a[3]占據(jù)了連續(xù)的6字節(jié)存儲(chǔ)空間(在16位編譯器環(huán)境下,一個(gè)int類型占用2個(gè)字節(jié))。要注意的是,數(shù)組名代表著整個(gè)數(shù)組的地址,也就是數(shù)組的起始地址。

注意:其實(shí)a不算是變量,是個(gè)常量,它代表著數(shù)組的地址。上圖把a(bǔ)放到變量一欄是為了方便大家理解數(shù)組結(jié)構(gòu)。
數(shù)組a的地址是ffc1,a[0]的地址是ffc1,a[1]的地址是ffc3,a[2]的地址是ffc5。因此a == &a[0],即第一個(gè)元素的地址就是整個(gè)數(shù)組的地址
3.一維數(shù)組的初始化
? 初始化的一般形式是:類型? 數(shù)組名[元素個(gè)數(shù)] = {元素1, 元素2, ...};
inta[2] = {8,10};
其實(shí)相當(dāng)于:
inta[2];
a[0] =8;
a[1] =10;
注意的是:C語言中編譯器是不會(huì)對(duì)數(shù)組下標(biāo)越界進(jìn)行檢查的,所以自己訪問數(shù)組元素時(shí)要小心
? 元素值列表可以是數(shù)組所有元素的初值,也可以是前面部分元素的初值
inta[4] = {2,5};
當(dāng)數(shù)組為整型時(shí),初始化未確定初值的元素,默認(rèn)為0,所以上面的a[2]、a[3]都為0
??當(dāng)對(duì)全部數(shù)組元素都賦初值時(shí),可以省略元素個(gè)數(shù)
inta[] = {2,5,7};
說明數(shù)組a的元素個(gè)數(shù)是3
? 數(shù)組初始化時(shí)的賦值方式只能用于數(shù)組的定義,定義之后只能一個(gè)元素一個(gè)元素地賦值
下面的寫法是錯(cuò)誤的:
inta[3];
a[3] = {1,2,3};? ?// 錯(cuò)誤
a = {1,2,3};? ?// 錯(cuò)誤
其實(shí)為什么是錯(cuò)誤的寫法呢?我們可以簡要分析一下。
1> 第2行的a[3]代表著訪問數(shù)組的第4個(gè)元素,首先這里已經(jīng)是數(shù)組下標(biāo)越界了;就算沒有越界,給a[3]賦值時(shí)也應(yīng)該賦一個(gè)int類型的整數(shù),不應(yīng)該是{}。
2> 第3行的a是數(shù)組名,代表著數(shù)組的地址,它是個(gè)常量!給常量賦值,那肯定錯(cuò)了!
4.一維數(shù)組與函數(shù)參數(shù)
??一維數(shù)組的元素作為函數(shù)實(shí)參,與同類型的簡單變量作為實(shí)參一樣,是單向的值傳遞,即數(shù)組元素的值傳給形參,形參的改變不影響實(shí)參

輸出結(jié)果:

? 大家都知道,數(shù)組名代表著整個(gè)數(shù)組的地址,如果一維數(shù)組的名字作為函數(shù)實(shí)參,傳遞的是整個(gè)數(shù)組,即形參數(shù)組和實(shí)參數(shù)組完全等同,是存放在同一存儲(chǔ)空間的同一個(gè)數(shù)組。這樣形參數(shù)組修改時(shí),實(shí)參數(shù)組也同時(shí)被修改了。形參數(shù)組的元素個(gè)數(shù)可以省略。

輸出結(jié)果:

二、二維數(shù)組
1.二維數(shù)組的定義
定義形式:類型? 數(shù)組名[行數(shù)][列數(shù)]
inta[2][3];? ?// 共2行3列,6個(gè)元素
2.二維數(shù)組的存儲(chǔ)
? C語言把二維數(shù)組當(dāng)作是一維數(shù)組的集合,即二維數(shù)組是一個(gè)特殊的一維數(shù)組:它的元素是一維數(shù)組。例如int a[2][3]可以看作由一維數(shù)組a[0]和一維數(shù)組a[1]組成,這兩個(gè)一維數(shù)組都包含了3個(gè)int類型的元素

? 二維數(shù)組的存放順序是按行存放的,先存放第一行的元素,再存放第2行的元素。例如int a[2][3]的存放順序是:
a[0][0] → a[0][1] → a[0][2] → a[1][0] → a[1][1] → a[1][2]
? 再來看看在內(nèi)存中的存儲(chǔ)情況,例如int a[2][2]

注意:a[0]、a[1]也是數(shù)組,是一維數(shù)組,而且a[0]、a[1]就是數(shù)組名,因此a[0]、a[1]就代表著這個(gè)一維數(shù)組的地址
1> 數(shù)組a的地址是ffc1,數(shù)組a[0]的地址也是ffc1,即a = a[0];
2> 元素a[0][0]的地址是ffc1,所以數(shù)組a[0]的地址和元素a[0][0]的地址相同,即a[0] = &a[0][0];
3> 最終可以得出結(jié)論:a = a[0] = &a[0][0],以此類推,可以得出a[1] = &a[1][0]
3.二維數(shù)組的初始化
? 按行進(jìn)行初始化
inta[2][3] = { {2,2,3}, {3,4,5} };
??按存儲(chǔ)順序進(jìn)行初始化(先存放第1行,再存放第2行)
inta[2][3] = {2,2,3,3,4,5};
??對(duì)部分元素進(jìn)行初始化
inta[2][3] = { {2}, {3,4} };
intb[3][3] = { { }, { , ,2}, {1,2,3}};
??如果只初始化了部分元素,可以省略行數(shù),但是不可以省略列數(shù)
inta[][3] = {1,2,3,4,5,6};
inta[][3] = {{1,2,3}, {3,5}, {}};
? ? ? ?有些人可能想不明白,為什么可以省略行數(shù),但不可以省略列數(shù)。也有人可能會(huì)問,可不可以只指定行數(shù),但是省略列數(shù)?
? ? ? ?其實(shí)這個(gè)問題很簡單,如果我們這樣寫:
inta[2][] = {1,2,3,4,5,6};? ?// 錯(cuò)誤寫法
? ? ? ?大家都知道,二維數(shù)組會(huì)先存放第1行的元素,由于不確定列數(shù),也就是不確定第1行要存放多少個(gè)元素,所以這里會(huì)產(chǎn)生很多種情況,可能1、2是屬于第1行的,也可能1、2、3、4是第一行的,甚至1、2、3、4、5、6全部都是屬于第1行的
???三維乃至更多維的數(shù)組就不再提及了,大家以此類推。
想學(xué)習(xí)更多的關(guān)于C語言/C++的編程知識(shí)的,筆者推薦我專欄的編程學(xué)習(xí)交流聚集地~C語言/C++進(jìn)階之路 - 專題 - 簡書!如果你感興趣或者有需求的話可以申請(qǐng)一下!
如果你喜歡我的文章請(qǐng)幫我點(diǎn)一下關(guān)注、留言、分享,感謝!
2020!??!
