原帖連結:http://www.keepsimply.org/2012/07/06/in-c-arrays-why-is-this-true-a5-5a/
作者:獨酌逸醉
時間:2012.07.05
聲明:翻譯僅以技術學習和交流為目的,如需轉載請務必標明原帖連結。
來源:http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a
水平有限,如有翻譯不當,歡迎探討、批評與指正。
文章內容:
Dinah:
Joel 在 Stack Overflow podcast #34中指出,在C程式設計語言(aka: K&R)中,都提到了在 C 數組的一個性質:a[5] = 5[a]。
Joel 解釋說那是指標運算,但是我仍舊不理解,為什麼 a[5] == 5[a] ?
Mehrdad Afshari: 因為 a[5] 相當於 *(a+5) ,5[a] 相當於 *(5+a)。用小學數學我們就可以判斷它們是相等的。
這是一種數組作為指標的直接表現方式(This is the direct artifact of arrays behaving as pointers)。"a"是一個記憶體位址。"a[5]"是距離 a 5 個長度元素的值。元素的地址是 "a+5"。這和從記憶體位址開始 5 個元素的位置開始位移 a 個地址是一樣的,地址空間是(5+a)。
John MacIntyre: 我想知道是不是和 *(5*sizeof(a)) + a)一樣,要是這樣的話,就很好解釋了。
Mehrdad Afshar: 是的,我沒有提到 sizeof 的原因是那樣可以很簡單把問題解釋清楚,加上時候會變得複雜。(I was going to mention the size. but thought I would complicate just things to get the core idea.)
Johannes Schaub - litb : John,不需要使用 sizeof,系統在位移的時候,自動按照 sizeof 的大小的進行遞增的。
Mehrdad Afshari: @Dinah,站在C編譯器的角度上說,你是對的。不需要考慮 sizeof,我提到的這些運算式也是類似的(不用考慮sizeof)。然而編譯器在產生機器碼的時候,會考慮 sizeof 的。如果 a 是一個 int 數組,a[5] 編譯器將會使用 mov eax, [ebx+20] 這樣的彙編代碼來實現,而不是 [ebx+5]。
David Thornley:因為數組的存取方式被定義成指標(的存取方式),a[i] 實現為 *(a+i),它們是可互換的。
筆者:
1.<a href="http://www.cppleyuan.com">C++奮鬥樂園</a>曾經有一個類似的文章,關心這個問題的朋友可以去看看,很不錯。 關於二維數組中的元素a[i][j]的訪問問題
2.我沒有完全把整個文章翻譯完,有一些評分較低的,我就沒有翻譯。
3.翻譯完之後,我覺得這個文章選擇的不太好,內容不夠充實。引發我一些思考,我考慮下次翻譯要不要找一些文章來翻譯。