C之數組(二十五)

        在 C 語言中,咱們不可避免的要接觸到數組。咱們就來看看數組是什麼玩意,其實數組就是相同類型的變量的有序集合。下面這張圖更加形象的表示出數組的含義數組

圖片.png

        數組在一片連續的內存空間中存儲元素,數組元素的個數是能夠顯示或隱式指定的。好比: 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;
}

        編譯後結果以下學習

圖片.png

        那麼咱們看到編譯器默認指定數組後面沒指明的元素全都爲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;
}

        編譯結果以下指針

圖片.png

        咱們看到三個地址相同。數組名錶明首元素的首地址,在這塊,第一個和第三個就是相同的意義。可是第二個和他們所表明的意義不相同。舉個例子來講,舉行人大時,每一個人表明他們各自的省份,在這時他一我的就能夠表明他們的省份的意見。但你能說他和他的省份是一個概念嘛,顯然是不同的,只是在特定環境下僅僅相同罷了。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行是兩個數組名進行賦值操做,這確定會出錯。從另外一個角度看,咱們前面說了數組名能夠看作是一個常量指針,那麼咱們將常量指針賦值給另外一個常量指針確定會出錯啊。接下來咱們看看編譯結果內存

圖片.png

        編譯報錯,咱們註釋掉第27行,再次編譯編譯器

圖片.png

        咱們看到結果和咱們分析的是一致的。經過對數組的學習,總結以下:一、數組是一片連續的內存空間;二、數組的地址和數組首元素的地址意義不一樣;三、數組名在大多數狀況下被當成常量指針處理,單數數組名並非指針,不能將其等同於指針。


        歡迎你們一塊兒來學習 C 語言,能夠加我QQ:243343083

相關文章
相關標籤/搜索