27 陣列的本質分析

2021-10-02 08:37:10 字數 3168 閱讀 6739

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:4.4.5

一、陣列的概念

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

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

二、陣列的大小

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

2) 陣列元素的個數可以顯示或隱式指定

int a[5] = ;          //顯示指定陣列大小

int b = ; //隱式指定陣列大小

問題:

1. a[2]、a[3]、a[4]的值是多少? a[2]=0,a[3]=0,a[4]=0

2. b包含了多少個元素?  2個元素 

程式設計實驗

陣列的初始化

27-1.c

#include int main()

; //剩下的3個元素數值為0

int b = ; //可以省略索引值,讓編譯器自動補充大小

printf("a[2] = %d\n", a[2]); //0

printf("a[3] = %d\n", a[3]); //0

printf("a[4] = %d\n", a[4]); //0

printf("sizeof(a) = %d\n", sizeof(a)); //20

printf("sizeof(b) = %d\n", sizeof(b)); //8

printf("count for a: %d\n", sizeof(a)/sizeof(int)); //5

printf("count for b: %d\n", sizeof(b)/sizeof(int)); //2

return 0;

}

操作:

1) gcc 27-1.c -o 27-1.out編譯正確,列印結果:

a[2] = 0

a[3] = 0

a[4] = 0

sizeof(a) = 20 //通過陣列名a確定整體陣列大小

sizeof(b) = 8 //通過陣列名b確定整體陣列大小

count for a: 5

count for b: 2

分析:

sizeof在編譯階段就計算好陣列長度,與執行期無關。

三、陣列位址與陣列名

1) 陣列名代表陣列首元素的位址(右值)

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

3) 陣列首元素的位址值與陣列的位址值相同

4) 陣列首元素的位址與陣列的位址是兩個不同的概念(單個元素和整個陣列)

程式設計實驗

陣列名和陣列位址

27-2.c

#include int main();

printf("a = %p\n", a); //陣列首元素位址

printf("&a = %p\n", &a); //陣列位址

printf("&a[0] = %p\n", &a[0]);//等價於a,都表示陣列首元素的位址

return 0;

}

操作: 

1) gcc 27-2.c -o 27-2.out編譯正確,列印結果:

a = 0xbfd9a45c    

&a = 0xbfd9a45c

&a[0] = 0xbfd9a45c

四、陣列名的盲點

1) 陣列名「指向」的是記憶體中陣列首元素的起始位置(指向是為了方便理解)

2) 陣列名不包含陣列的長度資訊

3) 在表示式中陣列名只能作為右值使用

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

- 陣列名作為sizeof操作符的引數(表示陣列的大小)

- 陣列名作為&運算子的引數 (表示陣列的位址,類似type (*a)[n])

例項分析

陣列和指標並不相同

27-3.c

#include int main()

; int b[2]; //初始值隨機

int* p = null;

p = a; //指標p指向陣列a

printf("sizeof(a) = %d\n", sizeof(a)); //20-陣列a指定的是陣列大小

printf("sizeof(p) = %d\n", sizeof(p)); //4-指標和陣列不同,指標儲存的是位址

///*

printf("\n");

p = b;

printf("&p = %p\n", &p); //陣列b的位址

printf("sizeof(b) = %d\n", sizeof(b)); //8

printf("sizeof(p) = %d\n", sizeof(p)); //4

b = a;

//*/

return 0;

}

操作:

1) gcc 27-3.c -o 27-3.out編譯正確,列印結果:

a = 0xbfae408c

p = 0xbfae408c

&p = 0xbfae4080

sizeof(a) = 20

sizeof(p) = 4

b = 0xbfae4084

p = 0xbfae4084

&p = 0xbfae4080

sizeof(b) = 8

sizeof(p) = 4

分析:

sizeof(陣列名)=陣列大小。

小結 1) 陣列是一片連續的記憶體空間

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

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

4) 陣列名其實並不是指標,不能將其等同於指標

27 陣列的本質

1 陣列的概念 2 陣列的大小 3 陣列位址與陣列名 4 陣列的盲點 b a 陣列名是常量不可被賦值 return0 a 0x7ffcc046cf30 p 0x7ffcc046cf30 p 0x7ffcc046cf18 sizeof a 20 sizeof p 8 b 0x7ffcc046cf20 ...

陣列的本質分析

陣列是相同型別的變數的有序集合 陣列在一片連續的記憶體空間中儲存元素 陣列元素的個數可以顯示或隱式指定 int a 5 int b 陣列名代表陣列首元素的位址 陣列的位址需要取位址符 才能得到 陣列首元素的位址與陣列的位址值相同 陣列首元素的位址與陣列的位址是兩個不同的概念 陣列名可以看作乙個常量指...

本質啊本質之四 陣列的本質

陣列 1.陣列是同型別的聚合 2.定義乙個陣列,如 type x n 意思是記憶體裡有 n個連續的 type 型變數,連續的排列在一起。x 是第乙個元素的位址,是乙個立即數,是右值,不是變數。x x 0 這是編譯器處理的,因為當你將 x 賦值給乙個指標時 編譯器實際上就用的 x 0 3.多維陣列也是...