搜尋

首頁  >  問答  >  主體

c++ - 数组名取地址

 int a[2];
 printf("%x  %x\n", a, &a);  // a &a 输出一样

怎么解释这种现象

伊谢尔伦伊谢尔伦2804 天前574

全部回覆(9)我來回復

  • PHP中文网

    PHP中文网2017-04-17 14:00:17

    陣列名,用來存取陣列元素的時候,它就表示陣列的首位址,而當你用它來存取陣列本身的時候,它就是陣列的位址。只不過數組的首位址與數組的位址相同而已。

    a 表示 &a[0]a+1 表示 &a[1]…在這個層次上,陣列名等效於可以存取陣列內部元素的指標。

    &a 是對陣列這個『物件』取址,而 &a + 1 表示與陣列 a 規模相同的另一個陣列。在這個層次上,&a 等效於存取數組這個整體的指標-指向數組的指標。

    回覆
    0
  • 阿神

    阿神2017-04-17 14:00:17

    C風格陣列是平鋪在堆疊上的,其構成除了陣列元素之外又沒有其它成員。所以,數組首個元素和數組位址一樣不很正常嗎?要嘛怎麼叫「首個」元素呢。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 14:00:17

    有一個方法可能可以幫你理解
    執行下面的程式碼

    int a[64];
    printf("%x  %x  %x  %x", a, a+1, &a, (&a)+1);

    在我的機器上,運行結果是:
    29fe10 29fe14 29fe10 29ff10
    第一個結果和第二個結果差4,第三個結果和第四個結果差0x100
    4剛好是int的長度,0x100(256)剛好是一個為長64的int數組的長度

    a是這個陣列的首元素的位址,所以你才能用*(a+i)的方式存取第i個元素,而&a是這個陣列的位址,但因為一塊資料的位址是取其首字節的位址,所以他們的值相同

    回覆
    0
  • 迷茫

    迷茫2017-04-17 14:00:17

        char A[20][20][20][20];
        printf("%x  %x  %x  %x  %x ", A[0][0][0] ,A[0][0],A[0], A, &A);

    這五個值的也是一模一樣

    回覆
    0
  • 阿神

    阿神2017-04-17 14:00:17

    如果一個變數儲存自己的位址,那麼對它取一萬次位址,也是它自己,

    以上有誤。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 14:00:17

    在C語言中,當數組名作為函數參數的時候,它會被轉換為指向數組第一個元素的指針,又因為數組第一個元素的位址就等於數組位址,所以這裡傳到printf裡的a&a參數,對應它們在函數內部的物件的是相等的,且都等與數組的位址。

    回覆
    0
  • 阿神

    阿神2017-04-17 14:00:17

    • &a是陣列的位址

    • a是陣列首元素的首位址

    • &a + 1 已經跑到陣列外面了

    • a + 1是陣列的第二個元素的位址

    回覆
    0
  • 阿神

    阿神2017-04-17 14:00:17

    a和&a的值都是位址,這兩個位址是相等的。

    但是a和&a的型別不一樣,具體的說:
    a的型別是int *
    &a的型別是int (*)[2]

    這個類型會影響指標加減運算的結果,所以a+1和(&a)+1結果不等。
    在這個例子中,a+1比a多4個位元組,(&a)+1比&a多8位元組

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 14:00:17

    在C中,陣列名的值是指標常數,也就是陣列第一個元素的位址
    所以
    &a, a, &a[0] 三者是等價的

    回覆
    0
  • 取消回覆