C語言必學(xué)知識(shí)點(diǎn)詳解【C語言 - 數(shù)組】!

為了讓大家更好地學(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!??!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,061評(píng)論 0 2
  • 數(shù)組在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱...
    朱森閱讀 4,272評(píng)論 2 13
  • 學(xué)習(xí)C語言程序設(shè)計(jì)都會(huì)用到高等數(shù)學(xué)知識(shí)和計(jì)算機(jī)基礎(chǔ)理論知識(shí)。 使用可變參數(shù)應(yīng)該有以下步驟: 1)首先在函數(shù)里定義一...
    皓小天閱讀 6,068評(píng)論 0 2
  • 第四天 數(shù)組【悟空教程】 第04天 Java基礎(chǔ) 第1章數(shù)組 1.1數(shù)組概念 軟件的基本功能是處理數(shù)據(jù),而在處理數(shù)...
    Java幫幫閱讀 1,682評(píng)論 0 9
  • 前段時(shí)間有同學(xué)評(píng)論說,指針方面的問題不太懂,今天小編就給大家?guī)矸浅T敿?xì)的c語言之指針學(xué)習(xí)資料。 前言:復(fù)雜類型說...
    諸葛青云999閱讀 31,384評(píng)論 0 17

友情鏈接更多精彩內(nèi)容