2013-07-08 36 views
3

我從來沒有讀過關於解引用數組的指針一樣東西,我認爲這不應該工作。但下面的代碼可以使用QT Creator和g ++ 4.8工作:C++解引用數組

int ar[9]{1,2,3,4,5,6,7,8,9}; 
cout << *ar << endl; //prints the first element of ar 

它是正確的行爲還是隻是編譯器修復代碼?

+3

這是可以的。 'ar'衰變爲指向數組的第一個元素的指針。所以你正在解除參考。 – juanchopanza

+0

有些人使用*(AR ++)在一個循環中,就像你可以使用一個整數來跟蹤該陣列的位置的[]是隻是一個漂亮的方式做到這一點*(AR +指數)的作品太 – Lefsler

+0

@juanchopanza感謝。 – 2013Asker

回答

4

您不能解引用數組,只有一個指針。

這裏發生的是,數組類型的表達,在大多數情況下,隱式轉換爲(「衰減」來)的指針數組對象的第一個元素。所以ar「衰變」爲&ar[0];取消引用爲您提供ar[0]的值,該值爲int

This recent answer of mine對C進行了詳細討論.C++的規則類似,但C++有更多的情況下轉換不會發生(在您的代碼中沒有發生這種情況)。

+0

請糾正我如果我錯了,但在C/C++中的數組並不總是一個指針? – Lefsler

+0

@demonofnight,數組永遠不會是一個指針。 – chris

+0

數組本身不是,但是當你創建一個數組時,這個變量在c/C++中的接收和地址,而且似乎每次創建數組時都會發生這種情況,我知道數組是序列存儲區中的一系列元素。但變量接收第一個元素的地址,這就是我總是用指針的意思。左側變量總是接收數組中第一個對象的內存地址 – Lefsler

1

這是正確的。 獲取內存位置並取消引用,所以前4個字節是整數。 你可以通過*(ar + 1)來獲得第二個內存位置,解除引用並重新獲得前4個字節。 4個字節,因爲這是一個整數,如果你的機器是32位和sizeof(int)的== 4

+2

阿洛斯,爲什麼是4個字節? –

+0

這是因爲它需要從位置讀取4個字節(32位整數),因爲它是一個整數,如果它只是一個字節的字符。和一個32位存儲器指針也有4個字節。如果我說錯了什麼,請糾正我,自從我玩了一段時間後,它有蜜蜂。 – Lefsler

+2

有什麼不正確的是你的假設'int'必須有4個字節。大小不能保證是4,它也可能是2或8(通常是4,但這不是一個規則) –

0

我相信這是正確的行爲。指向數組的指針總是從數組的頭部開始 - 這是第一個元素。在這種情況下,將會是'ar [0]',並且輸出應該是'1'。