我從來沒有讀過關於解引用數組的指針一樣東西,我認爲這不應該工作。但下面的代碼可以使用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
它是正確的行爲還是隻是編譯器修復代碼?
我從來沒有讀過關於解引用數組的指針一樣東西,我認爲這不應該工作。但下面的代碼可以使用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
它是正確的行爲還是隻是編譯器修復代碼?
您不能解引用數組,只有一個指針。
這裏發生的是,數組類型的表達,在大多數情況下,隱式轉換爲(「衰減」來)的指針數組對象的第一個元素。所以ar
「衰變」爲&ar[0]
;取消引用爲您提供ar[0]
的值,該值爲int
。
This recent answer of mine對C進行了詳細討論.C++的規則類似,但C++有更多的情況下轉換不會發生(在您的代碼中沒有發生這種情況)。
這是正確的。 獲取內存位置並取消引用,所以前4個字節是整數。 你可以通過*(ar + 1)來獲得第二個內存位置,解除引用並重新獲得前4個字節。 4個字節,因爲這是一個整數,如果你的機器是32位和sizeof(int)的== 4
阿洛斯,爲什麼是4個字節? –
這是因爲它需要從位置讀取4個字節(32位整數),因爲它是一個整數,如果它只是一個字節的字符。和一個32位存儲器指針也有4個字節。如果我說錯了什麼,請糾正我,自從我玩了一段時間後,它有蜜蜂。 – Lefsler
有什麼不正確的是你的假設'int'必須有4個字節。大小不能保證是4,它也可能是2或8(通常是4,但這不是一個規則) –
我相信這是正確的行爲。指向數組的指針總是從數組的頭部開始 - 這是第一個元素。在這種情況下,將會是'ar [0]',並且輸出應該是'1'。
這是可以的。 'ar'衰變爲指向數組的第一個元素的指針。所以你正在解除參考。 – juanchopanza
有些人使用*(AR ++)在一個循環中,就像你可以使用一個整數來跟蹤該陣列的位置的[]是隻是一個漂亮的方式做到這一點*(AR +指數)的作品太 – Lefsler
@juanchopanza感謝。 – 2013Asker