在 C 語言中,咱們不可避免的要接觸到數組。咱們就來看看數組是什麼玩意,其實數組就是相同類型的變量的有序集合。下面這張圖更加形象的表示出數組的含義數組
數組在一片連續的內存空間中存儲元素,數組元素的個數是能夠顯示或隱式指定的。好比: int a[5] = {1, 2}; int b[] = {1, 2};那麼問題來了,數組 a 中其他沒指定的三個數是多少呢?數組 b 到底包含了多少個元素呢?咱們下來作個實驗看看是怎樣的,代碼以下ide
#include <stdio.h> int main() { int a[5] = {1, 2}; int b[] = {1, 2}; printf("a[2] = %d\n", a[2]); printf("a[3] = %d\n", a[3]); printf("a[4] = %d\n", a[4]); printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(b) = %d\n", sizeof(b)); printf("count for a: %d\n", sizeof(a)/sizeof(int)); printf("count for b: %d\n", sizeof(b)/sizeof(int)); return 0; }
編譯後結果以下學習
那麼咱們看到編譯器默認指定數組後面沒指明的元素全都爲0,而隱式指定的數組的大小就是它們所包含的元素的個數。spa
那麼接下來咱們來看看數組地址與數組名的關係。數組名錶明數組首元素的地址,數組的地址須要用取地址符 & 才能獲得;數組首元素的地址與數組的地址值相同,可是數組首元素的地址與數組的地址是兩個不一樣的概念。咱們來作個實驗,能夠更加清晰的理解這段所說的概念,代碼以下3d
#include <stdio.h> int main() { int a[5] = { 0 }; printf("a = %p\n", a); printf("&a = %p\n", &a); printf("&a[0] = %p\n", &a[0]); return 0; }
編譯結果以下指針
咱們看到三個地址相同。數組名錶明首元素的首地址,在這塊,第一個和第三個就是相同的意義。可是第二個和他們所表明的意義不相同。舉個例子來講,舉行人大時,每一個人表明他們各自的省份,在這時他一我的就能夠表明他們的省份的意見。但你能說他和他的省份是一個概念嘛,顯然是不同的,只是在特定環境下僅僅相同罷了。blog
接下來咱們介紹個有趣的,數組名其實能夠看作一個常量指針。數組名「指向」的是內存中數組首元素的起始位置,但數組名不包含數組的長度信息;在表達式中數組名只能做爲右值使用,只有在如下兩種場合中數組名不能看作是常量指針:a> 數組名做爲 sizeof 操做符的參數;b> 數組名做爲 & 運算符的參數。下來咱們再作個示例代碼分析下,代碼以下圖片
#include <stdio.h> int main() { int a[5] = {0}; int b[2]; int* p = NULL; p = a; printf("a = %p\n", a); printf("p = %p\n", p); printf("&p = %p\n", &p); printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(p) = %d\n", sizeof(p)); printf("\n"); p = b; printf("b = %p\n", b); printf("p = %p\n", p); printf("&p = %p\n", &p); printf("sizeof(b) = %d\n", sizeof(b)); printf("sizeof(p) = %d\n", sizeof(p)); b = a; return 0; }
咱們在第9行將數組名 a 賦值給指針 p,這是沒錯的,由於數組名能夠看作是數組首元素的首地址。咱們接着經過打印 a 和 p 的地址應該是相同的,可是指針也是變量,它自身也有地址,因此第13行打印出來的應該和前兩個地址不相同。接下來打印數組 a 的大小應該是20,指針 p 的大小應該是 4。顯示指定的數組 a 和 隱式指定的數組 b 的狀況應該是相同的。但第27行是兩個數組名進行賦值操做,這確定會出錯。從另外一個角度看,咱們前面說了數組名能夠看作是一個常量指針,那麼咱們將常量指針賦值給另外一個常量指針確定會出錯啊。接下來咱們看看編譯結果內存
編譯報錯,咱們註釋掉第27行,再次編譯編譯器
咱們看到結果和咱們分析的是一致的。經過對數組的學習,總結以下:一、數組是一片連續的內存空間;二、數組的地址和數組首元素的地址意義不一樣;三、數組名在大多數狀況下被當成常量指針處理,單數數組名並非指針,不能將其等同於指針。
歡迎你們一塊兒來學習 C 語言,能夠加我QQ:243343083。