陣列 基礎知識

2021-07-26 18:54:01 字數 2037 閱讀 1535

陣列是相同型別的變數的有序集合

int a[5];
陣列示意圖:陣列包含5個int型別的資料

陣列在一片連續的記憶體空間中儲存元素。

陣列元素的個數可以顯式隱式指定。

對於a,a[2]a[3]a[4]都為0;對於b,元素個數為2。

在定義陣列並初始化的時候,給陣列的前幾位初始化設定相應的值之後,如果沒有給後幾位初始化,系統將自動將後面的陣列元素值初始化設定為0。

可以利用此來設定乙個全0陣列:int a[5] = ;將第乙個元素初始化為0,後面的自動初始化為0。

初始化比賦值更高效,因此可以盡量採用初始化。

陣列名代表陣列首元素的位址

陣列的位址需要用取位址符&才能得到

陣列首元素的位址值與陣列的位址值相同,但是意義不同。

陣列首元素的位址與陣列的位址是兩個不同的概念

陣列名的盲點:

陣列名可以看做乙個常量指標不能作左值,陣列名「指向」的是記憶體中陣列首元素的起始位置,在表示式中陣列名只能作為右值使用。

只有在下列場合中陣列名不能看做常量指標:

舉例,下面的錯誤做法:

這樣的做法是錯誤的,常量指標陣列名不能作左值。編譯直接報錯。

#include 

// another file

// char* p = "hello world!";

extern

char p;

int main()

定義為指標,宣告為陣列。程式輸出的結果是亂碼,不是「hello world!」。在其他檔案定義p指標時,編譯器為p分配乙個4位元組的空間,存入了「hello world!」字串的首位址,在extern宣告的時候,宣告為陣列,這樣編譯器把字串的首位址轉變為陣列的各個元素的內容,存放在陣列p中。這樣列印出來的就是字串的位址,而不是字串的內容。

由上面的程式可以看出,雖然陣列名可以看作乙個常量指標,但是編譯器對指標和陣列的處理是不同的。以printf(「%s\n」, p);這句話為例,當p為指標的時候,編譯器會定址,列印出以p的內容為位址的記憶體中的內容。但是當p為陣列的時候,只會直接列印出p陣列的內容。

由此可見,編譯器處理指標時,會做一次定址,處理陣列時,不會定址。

把上面的程式改為:

printf("%s\n", (char *)(*((unsigned int *)p)));

這樣列印出來的就是「hello world!」。

首先,將p陣列轉變為乙個指向unsigned int型別的指標,p陣列有4位元組unsigned int型別也是4位元組,把p由指向陣列首位址的指標,轉變為指向整個存放字串位址的記憶體的指標。然後加星號*,得到p指標指向的記憶體的內容,也就是字串的位址,再把該內容轉變為指向字元的指標型別,最後得到指向字串的指標,列印出字串的內容。

但是最好的修改方式,就是定義為指標,同樣也要宣告為指標。

陣列是一片連續的記憶體空間

陣列的位址和陣列首元素的位址意義不同

陣列名在大多數情況下被當成常量指標處理

陣列名其實並不是指標,在外部宣告時不能混淆

陣列基礎知識

陣列 1 定義 儲存相同型別的一組資料 格式 陣列型別 陣列名 new 陣列型別 陣列長度 基本要素 識別符號 陣列元素 元素下標 從0開始 元素型別 初始化陣列 方式 1 int nums new int 3 方式 2 int nums 方式 3 int nums new int nums 0 1...

陣列基礎知識

陣列的宣告 陣列是相同型別的資料按順序組成的一種復合資料型別。通過陣列名加陣列下標,來使用陣列中的資料。下標從 0 開始排序。宣告一維陣列 陣列元素型別 陣列名 宣告二維陣列 陣列元素型別 陣列名 陣列的例項化 陣列的初始化 靜態初始化 格式一 資料型別 陣列名 格式二 資料型別 陣列名 new i...

陣列基礎知識集錦

一 賦值 1 陣列在賦值的時候如果是在定義的時直接賦值那麼哪些沒有賦值的就直接被預設賦值為空,這種情形數值型的陣列和字元型的陣列都滿足 例如 include using namespace std int main cout 輸出 abcd 注意a前面有乙個空字元 2 但是如果在定義和賦值不在一起的...