c語言學習筆記(15) 陣列基礎

2021-07-06 00:25:50 字數 1708 閱讀 4068

摘要:總結了陣列的概念,陣列大小的計算方法,陣列位址和陣列名的關係,陣列存在的一些盲點,最後用乙個bug例項對陣列和指標的乙個差別進行了分析。

一、陣列的概念

陣列是相同型別變數的有序集合,比如我們定義乙個陣列int a[5],那麼這個陣列名字就叫a,a就代表陣列元素中的第乙個元素的起始位址,這個陣列裡面有五個元素,每個元素都是int型別的,其中a[0],a[1],a[2],a[3],a[4],分別代表陣列中的元素的內容,並非陣列元素的名字,陣列元素沒有名字。

二、陣列的大小

陣列在一片連續的記憶體空間中儲存元素,其中元素的個數,可以顯示或者隱式的指定。

比如:int a[5]=

int b=

其中a有五個元素,如果對其進行了元素的賦值,其他不寫出來的都預設填進去0,也就是a=,如果顯示的指定了大小,但是列表中沒有給出元素,那麼就會填充隨機值,這一點可以利用來初始化陣列為0,只需要int a[5]=;b只含有兩個元素,隱式指定列表寫了幾個元素,就是幾個元素。

另外,陣列的大小:sizeof(a)

陣列的長度(也就是元素的個數):sizeof(a)/sizeof(*a)

三、陣列位址與陣列名

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

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

陣列首元素的位址值和陣列的位址值相同

4.陣列首元素的位址和陣列的位址雖然值相同,但是意義不同

意義不同是因為,陣列位址代表的是一整塊存放陣列元素記憶體空間的位址,但是首元素只是代表這個第乙個元素的位址,雖然他們的位址相同,但是意義不同。

四、陣列名的盲點

1.陣列名可以看做乙個常量指標,什麼意思呢?就是不能作為左值使用,只能作為右值。

2.陣列名「指向」的是陣列當中首元素的起始位址。

3.在表示式中陣列名只能作為左值使用,比如a[5]=b[5],絕對是錯誤的。

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

陣列名作為sizeof()函式的引數

陣列名作為取位址運算子的引數

五、bug例項解析

這個例子主要是為了說明陣列和指標的乙個區別,在檔案test.c中,宣告為陣列了,但是定義在another.c檔案中的時候是定義為乙個指標,使用的時候會出現錯誤。根本原因,是因為指標存在乙個定址過程,而陣列沒有。具體例子    如下:

test.c

#include extern char p;

int main(void)

another.c

char* p="hello world!";

最後輸出結果:亂碼!

為什麼呢?其實原因很簡單:原本another裡面,我們定義了乙個char*型別的指標p,p指向乙個字串hello world,p指標裡面存放的是hello world字串的起始位址,在test.c裡面,我們將其宣告成了陣列,在列印的時候,陣列直接指出輸出p裡面的東西,p裡面存放的是位址,當然輸出亂碼了。而指標不同,打定義為指標的時候,會做一次定址,根據p裡面存放的位址,找出指向的記憶體單元的內容。所以編譯器在處理陣列的時候和處理指標的時候,有本質區別。所以陣列名並不是指標,尤其在外部宣告的時候要注意。

這篇帖子就總結到這裡,如有不正確地方還請指出,大家共同進步!

C語言學習筆記《陣列》

1,已知陣列x有5個元素,精組y有6個元素.請分別對x和y排序。輸出x和y排序後的元素 include main y 6 int i,j,sum 0 for i 0 i 4 i int i,j,sum for i 0 i 9 i for i 0 i 9 i printf d t a i code c...

C語言學習筆記(四)陣列

一 陣列 1.陣列基本使用 陣列的定義格式 型別 陣列名 元素個數 int ages 5 19 19 28 27 26 ages 1 29 ages 0 19 ages 1 19 ages 2 28 ages 3 27 ages 4 26 遍歷 按順序檢視陣列的每乙個元素 for int i 0 i...

C語言學習筆記 陣列

陣列是用來儲存乙個固定大小的同型別元素的順序集合。type arrayname arraysize intarray 5 int array intarray 5 include int main int argc,const char argv int i for i 0 i 5 i 多維陣列最簡...