簡體   English   中英

為什么不(&array)[i]取第i個元素的地址?

[英]Why doesn't (&array)[i] take the address of the ith element?

請考慮以下代碼

int tab2[2];
tab2[0]=5;
tab2[1]=3;
std::cout << tab2[1] << std::endl;
std::cout << (&tab2)[1] << std::endl;

正如我在其他主題中所讀到的,數組可以衰減到指針的第一個元素。 那么為什么[]對於上面代碼中的tab2和&tab2不起作用呢? 有什么不同嗎?

它已經被“轉換”為指針。 您可以對數組或指針使用[]表示法...

(&tab2)表示你得到數組的地址......在指針透視圖中,它是指向指針( ** )的指針。

所以你試圖將一個變量(它是一個數組)轉換為指針。 好的,但是你試着訪問[1]元素,這當然不存在,因為你的指針指向你的數組的地址......這樣的表示法會期望第二個數組。

這個表達式:

(&tab2)[1]

獲取指向2個int的數組的指針。 然后在該指針到數組上使用數組語法,以獲得tab2之后的第2個2元素int數組。

所以你有記憶

          tab2

          0         1   // index into tab2
          5         3   // values

你得到一個指向數組的指針

          0         1
 &tab2 -> 5         3

然后你走過tab2的2個整數數組

          0         1         2        3
 &tab2 -> 5         3         ?        ?
                             /|\
                              (&tab2)[1]

使用(&tab2) ,您正在檢索陣列的地址。 你的陳述本身就是你的問題。 如果你使用過(*(&tab2)) ,你會得到你期望的輸出 - 3

你通過向tab2添加地址(&)來完成你自己給出了tab2指針的內存地址,或指向指針的指針(int **)。 所以邏輯上,是的,索引它是有道理的。 但是,&tab2與tab2不同。 &tab2指向指針itsefl,而tab2指向數組。 通過索引&tab2為1,你已經告訴它查看序列中的下一個元素,它不存在(或者它確實存在,但屬於另一個變量)。 如果你用0索引它,這將是很好的,因為你會看到內存序列的“根”。

僅對tab2進行索引也很明顯,因為它指向一個數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM