
為了讓大家更好地學習和了解數組,我們先來認識一下記憶體中的
"位址"。
位址
1.計算機中的記憶體是以位元組為機關的存儲空間。記憶體的每一個位元組都有一個唯一的編号,這個編号就稱為位址。凡存放在記憶體中的程式和資料都有一個位址,也就是說,一個函數也有自己的記憶體位址。
2.當定義一個變量時,系統就配置設定一個帶有唯一位址的存儲單元來存儲這個變量。比如:
chara ='A'; // A的ASCII值為65
intb =66;
在16bit編譯器環境下,系統為a、b分别配置設定1個位元組、2個位元組的存儲單元。變量存儲單元的
第一個位元組的位址就是該變量的位址。可以看出,變量a的位址是ffc3;變量b的位址是ffc1。記憶體中存儲的都是2進制資料。
3.在調試過程中,我們采取列印的方式檢視變量的位址:輸出結果:
一、一維數組
1.一維數組的定義
▷定義的形式為:
類型 數組名[元素個數]inta[5];
▷隻能放在數組名的後面,下面的都是錯誤寫法:
int[5] a; // 錯誤
int b; // 錯誤
▷裡面的個數必須是一個固定值,可以是常量(比如6、8)、常量表達式(比如3+4、5*7)。絕對不能使用變量或者變量表達式來表示元素個數,大多數情況下不要省略元素個數(當數組作為函數的形參和數組初始化時除外)
下面的都是
正确寫法:inta[5];// 整型常量
intb['A'];// 字元常量,其實就是65
intc[3*4];// 整型常量表達式
下面的都是
錯誤寫法:inta; // 沒有指定元素個數,錯誤
inti =9;
inta[i]; // 用變量做元素個數,錯誤
2.一維數組的存儲
定義數組時,系統将按照數組類型和個數配置設定一段連續的存儲空間來存儲數組元素,如int a[3]占據了連續的6位元組存儲空間(在16位編譯器環境下,一個int類型占用2個位元組)。要注意的是,
數組名代表着整個數組的位址,也就是數組的
起始位址。上圖把a放到變量一欄是為了友善大家了解數組結構。
數組a的位址是ffc1,a[0]的位址是ffc1,a[1]的位址是ffc3,a[2]的位址是ffc5。是以a == &a[0],即
第一個元素的位址就是整個數組的位址3.一維數組的初始化
▶ 初始化的一般形式是:類型 數組名[元素個數] = {元素1, 元素2, ...};
inta[2] = {8,10};
其實相當于:
inta[2];
a[0] =8;
a[1] =10;
注意的是:C語言中
編譯器是不會對數組下标越界進行檢查的,是以自己通路數組元素時要小心
▶ 元素值清單可以是數組所有元素的初值,也可以是前面部分元素的初值
inta[4] = {2,5};
當數組為整型時,初始化未确定初值的元素,預設為0,是以上面的a[2]、a[3]都為0
▶ 當對全部數組元素都賦初值時,可以省略元素個數
inta = {2,5,7};
說明數組a的元素個數是3
▶ 數組初始化時的指派方式隻能用于數組的定義,定義之後隻能一個元素一個元素地指派
下面的寫法是
錯誤的:
inta[3];
a[3] = {1,2,3}; // 錯誤
a = {1,2,3}; // 錯誤
其實為什麼是錯誤的寫法呢?我們可以簡要分析一下。
1>第2行的a[3]代表着通路數組的第4個元素,首先這裡已經是數組下标越界了;就算沒有越界,給a[3]指派時也應該賦一個int類型的整數,不應該是{}。
2>第3行的a是數組名,代表着數組的位址,
它是個常量!給常量指派,那肯定錯了!
4.一維數組與函數參數
▶
一維數組的元素作為函數實參,與同類型的簡單變量作為實參一樣,是單向的值傳遞,即數組元素的值傳給形參,形參的改變不影響實參
輸出結果:
▶ 大家都知道,數組名代表着整個數組的位址,如果一維數組的名字作為函數實參,傳遞的是整個數組,即形參數組和實參數組完全等同,是存放在同一存儲空間的同一個數組。這樣形參數組修改時,實參數組也同時被修改了。
形參數組的元素個數可以省略。輸出結果:
二、二維數組
1.二維數組的定義
定義形式:
類型 數組名[行數][列數]inta[2][3]; // 共2行3列,6個元素
2.二維數組的存儲
▶ C語言把二維數組當作是一維數組的集合,即
二維數組是一個特殊的一維數組:它的元素是一維數組。例如int a[2][3]可以看作由一維數組a[0]和一維數組a[1]組成,這兩個一維數組都包含了3個int類型的元素
▶ 二維數組的存放順序是按行存放的,先存放第一行的元素,再存放第2行的元素。例如int a[2][3]的存放順序是:
a[0][0] → a[0][1] → a[0][2] → a[1][0] → a[1][1] → a[1][2]
▶ 再來看看在記憶體中的存儲情況,例如int a[2][2]
a[0]、a[1]也是數組,是一維數組,而且a[0]、a[1]就是數組名,是以a[0]、a[1]就代表着這個一維數組的位址
1>數組a的位址是ffc1,數組a[0]的位址也是ffc1,即a = a[0];
2>元素a[0][0]的位址是ffc1,是以數組a[0]的位址和元素a[0][0]的位址相同,即a[0] = &a[0][0];
3>最終可以得出結論:a = a[0] = &a[0][0],以此類推,可以得出a[1] = &a[1][0]
3.二維數組的初始化
▶ 按行進行初始化
inta[2][3] = { {2,2,3}, {3,4,5} };
▶ 按存儲順序進行初始化(先存放第1行,再存放第2行)
inta[2][3] = {2,2,3,3,4,5};
▶ 對部分元素進行初始化
inta[2][3] = { {2}, {3,4} };
intb[3][3] = { { }, { , ,2}, {1,2,3}};
▶ 如果隻初始化了部分元素,
可以省略行數,但是不可以省略列數inta[3] = {1,2,3,4,5,6};
inta[3] = {{1,2,3}, {3,5}, {}};
有些人可能想不明白,為什麼可以省略行數,但不可以省略列數。也有人可能會問,可不可以隻指定行數,但是省略列數?
其實這個問題很簡單,如果我們這樣寫:
inta[2] = {1,2,3,4,5,6}; // 錯誤寫法
大家都知道,二維數組會先存放第1行的元素,由于不确定列數,也就是不确定第1行要存放多少個元素,是以這裡會産生很多種情況,可能1、2是屬于第1行的,也可能1、2、3、4是第一行的,甚至1、2、3、4、5、6全部都是屬于第1行的
☀ 三維乃至更多元的數組就不再提及了,大家以此類推。
想學習更多的關于C語言/C++的程式設計知識的,筆者推薦我一個程式設計技術學習交流俱樂部~企鵝圈:
977 & 829 & 392(去掉符号)!如果你感興趣或者有需求的話可以申請一下!
如果你喜歡我的文章請幫我點一下關注、留言、分享,感謝!
2020!!!