C語言 08 陣列

2021-09-08 18:25:07 字數 3786 閱讀 8035

1.計算機中的記憶體是以位元組為單位的儲存空間。記憶體的每乙個位元組都有乙個唯一的編號,這個編號就稱為位址。凡存放在記憶體中的程式和資料都有乙個位址,也就是說,乙個函式也有自己的記憶體位址。

char a = 'a'; // a的ascii值為65

int b = 66;

在16bit編譯器環境下,系統為a、b分別分配1個位元組、2個位元組的儲存單元。變數儲存單元的第乙個位元組的位址就是該變數的位址。

可以看出,變數a的位址是ffc3;變數b的位址是ffc1。記憶體中儲存的都是2進製資料。

int c = 10;

// 以16進製制形式輸出位址

printf("16進製制:%x\n", &c);

// 以10進製形式輸出位址

printf("10進製:%d", &c);

輸出結果:

回到頂部

* 定義的形式為:型別  陣列名[元素個數]

int a[5];
* 只能放在陣列名的後面,下面的都是錯誤寫法:

int[5] a; // 錯誤

int b; // 錯誤

* 裡面的個數必須是乙個固定值,可以是常量(比如6、8)、常量表示式(比如3+4、5*7)。絕對不能使用變數或者變數表示式來表示元素個數,大多數情況下不要省略元素個數(當陣列作為函式的形參和陣列初始化時除外)

下面的都是正確寫法:

int  a[5];   // 整型常量

int b['a']; // 字元常量,其實就是65

int c[3*4]; // 整型常量表示式

下面的都是錯誤寫法:

int a; // 沒有指定元素個數,錯誤

int i = 9;

int a[i]; // 用變數做元素個數,錯誤

定義陣列時,系統將按照陣列型別和個數分配一段連續的儲存空間來儲存陣列元素,如int a[3]佔據了連續的6位元組儲存空間(在16位編譯器環境下,乙個int型別占用2個位元組)。要注意的是,陣列名代表著整個陣列的位址,也就是陣列的起始位址。

注意:其實a不算是變數,是個常量,它代表著陣列的位址。上圖把a放到變數一欄是為了方便大家理解陣列結構。

陣列a的位址是ffc1,a[0]的位址是ffc1,a[1]的位址是ffc3,a[2]的位址是ffc5。因此a == &a[0],即第乙個元素的位址就是整個陣列的位址

* 初始化的一般形式是:型別  陣列名[元素個數] = ;

int a[2] = ;
其實相當於:

int a[2];

a[0] = 8;

a[1] = 10;

注意的是:c語言中編譯器是不會對陣列下標越界進行檢查的,所以自己訪問陣列元素時要小心

* 元素值列表可以是陣列所有元素的初值,也可以是前面部分元素的初值

int a[4] = ;
當陣列為整型時,初始化未確定初值的元素,預設為0,所以上面的a[2]、a[3]都為0

* 當對全部陣列元素都賦初值時,可以省略元素個數

int a = ;
說明陣列a的元素個數是3

* 陣列初始化時的賦值方式只能用於陣列的定義,定義之後只能乙個元素乙個元素地賦值

下面的寫法是錯誤的:

1 int a[3];

2 a[3] = ; // 錯誤

3 a = ; // 錯誤

其實為什麼是錯誤的寫法呢?我們可以簡要分析一下。

1> 第2行的a[3]代表著訪問陣列的第4個元素,首先這裡已經是陣列下標越界了;就算沒有越界,給a[3]賦值時也應該賦乙個int型別的整數,不應該是{}。

2> 第3行的a是陣列名,代表著陣列的位址,它是個常量!給常量賦值,那肯定錯了!

如果忘記了實參和形參的意思,可以回看下《四、函式

》這篇文章

* 一維陣列的元素作為函式實參,與同型別的簡單變數作為實參一樣,是單向的值傳遞,即陣列元素的值傳給形參,形參的改變不影響實參

// b是test函式的形參(形式引數)

void test(int b)

int main()

輸出結果:

* 大家都知道,陣列名代表著整個陣列的位址,如果一維陣列的名字作為函式實參,傳遞的是整個陣列,即形引數組和實參陣列完全等同,是存放在同一儲存空間的同乙個陣列。這樣形引數組修改時,實參陣列也同時被修改了。形引數組的元素個數可以省略。

// b是test函式的形參(形式引數)

void test(int b)

int main()

輸出結果:

回到頂部

定義形式:型別  陣列名[行數][列數]

int a[2][3]; // 共2行3列,6個元素
* 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]

* 按行進行初始化

int a[2][3] = ,  };
* 按儲存順序進行初始化(先存放第1行,再存放第2行)

int a[2][3] = ;
* 對部分元素進行初始化

int a[2][3] = ,  };

int b[3][3] = , , };

* 如果只初始化了部分元素,可以省略行數,但是不可以省略列數

int a[3] = ;

int a[3] = , , {}};

有些人可能想不明白,為什麼可以省略行數,但不可以省略列數。也有人可能會問,可不可以只指定行數,但是省略列數?

其實這個問題很簡單,如果我們這樣寫:

int a[2] = ; // 錯誤寫法
大家都知道,二維陣列會先存放第1行的元素,由於不確定列數,也就是不確定第1行要存放多少個元素,所以這裡會產生很多種情況,可能1、2是屬於第1行的,也可能1、2、3、4是第一行的,甚至1、2、3、4、5、6全部都是屬於第1行的

08 C語言陣列

c語言陣列 一 陣列的概念 用來儲存一組資料的構造資料型別 特點 只能存放一種型別的資料,如全部是int型或者全部是char型,陣列裡的資料成為元素。二 陣列的定義 格式 型別 陣列名 元素個數 舉例 儲存5個人的年齡 int agrs 5 在記憶體中開闢4x5 20個位元組的儲存空間 可以在定義陣...

C語言作業08

這個作業屬於那個課程 c語言程式ii 這個作業要求在 作業要求 我在這個課程的目標是 學會使用while迴圈 這個作業在那個具體方面幫助我實現目標 pta專項作業總結,鞏固while迴圈的運用 參考文獻 評價標準 三 本週作業 pta實驗作業 互評 學習總結 四 作業格式 1.pta實驗作業 20分...

C語言作業 08

這個作業屬於那個課程 c語言程式設計ii 這個作業要求在 c語言i作業08 我在這個課程的目標是 熟練掌握c語言 這個作業在那個具體方面幫助我實現目標 在pta上老師布置的型別作業 參考文獻 markdown基本語法 對於給定的正整數n,求它的位數及其各位數字之和。輸入格式 輸入在一行中給出乙個不超...