1. 程式人生 > >C語言中 陣列名 與 ”&陣列名” 的區別

C語言中 陣列名 與 ”&陣列名” 的區別

(1) 測試程式碼 :

#include<stdio.h>

int main()

{

    int a[5] = {1,2,3,4,5};

    printf("a = %p\n",a);         // 陣列名代表首地址 .        000000000064FE30

    printf("&a = %p\n",&a);    // "&a"代表陣列的地址 .     000000000064FE30

    printf("a+1 = %p\n",a+1);     // 陣列名代表首地址 .        000000000064FE34

    printf("&a+1 = %p\n",&a+1);  // "&a"代表陣列的地址

.  000000000064FE44

return 0;

}

分析 :

* a是陣列名, 代表陣列的首地址, a+1就是陣列的下一個元素的地址(也就是第二個元素的地址) .

* "000000000064FE34" - "000000000064FE30" = 4(轉換為十進位制也是4)

(因為int型的陣列一個變數佔4個位元組) .

* "000000000064FE30" - "000000000064FE44" = 14

   (轉換為十進位制是20), (因為int型陣列中有 5 個元素, 一個元素佔 4 個位元組) .

* 說明:

     (1) 陣列名 + 1 = 第二個元素 .

     (2) &陣列名 + 1 = 整個陣列的下一個地址 .

* "&陣列名" + 1 :

一次移動一個數組 .

* "陣列名"  + 1   : 一次移動一個元素

(2) 面試題 :

#include<stdio.h>

int main()

{

    int b[5] = {1,2,3,4,5};

    int *ptr1 = (int*)(&b + 1); 

    int *ptr2 = (int*)(b + 1);

    printf("%x\n",ptr1[-1]);   // 輸出 5

    printf("%x\n",*ptr2);     // 輸出 2

    return 0;

}

分析 :

* 可以把ptr1[-1]看成: *(ptr1 - 1), 因為這時候
ptr1 指向的是整個陣列的下一個地, 所以減一代表陣列中最後一個元素的地址 .

* ptr2最終指向的是陣列的第二個元素的地址 .

(3)誤區分析:

#include<stdio.h>

int main()
{
int ch[5] = {1,2,3,4,5};
int (*ptr1)[5] = &ch;  // 第二行 . 
int (*ptr2)[5] = ch;    // 第三行(報錯行) .

return 0;

分析 :

* 整個程式會在第三行出報錯, 因為前後的型別並不匹配 .

* &ch: 代表整個陣列的地址, 所以左右型別一致.

* ch   : 只代表陣列第一個元素的地址, 所以左右型別不一致 .