在 C 語言中,我們這樣宣告一個陣列:char c[] = "abcdefgh";
一般,我們會用 c[0]
, c[1]
, ... 這樣的語法來存取陣列。在這個例子中,我們知道 c[0]
為 'a'
,而 a[1]
為 'b'
,如果是寫成 3[c]
呢?一般人大概會猜 'd'
,沒錯!跟 c[3]
的值一樣,就是 'd'
。那如果宣告成 int
陣列呢?會不會有什麼不一樣的結果呢?int i[] = {1, 2, 3, 4, 5, 6, 7, 8};
2[i]
的值應該是多少?沒錯,答案還是跟 i[2]
一樣,就是 3
。
類似 3[c]
這般的寫法看起來很奇怪,令人全身不舒服,但是在 C/C++ 語言中卻是合法的。我們可以大膽假設:
對於一維陣列來說,如果 x[y]
符合語法,則 x[y]
就等於 y[x]
。
在 C 語言中,指標 (pointer) 與陣列 (array) 之間有著很密切的關係,一般人也常不明就裡地混用。根據 C 語言的規定,x[y]
跟 *((x) + (y))
是完全一樣的。換句話說,C 編譯器會把 x[y]
解讀為 *((x) + (y))
。而 x[y]
要能夠通過 C 語言文法,x
或 y
其中一個必須為指標,另一個必須能夠賦值 (evaluate) 為整數。以 binary operator + (加法) 作用在整數與指標上,最後會賦值為指標型別。因為加法具有可交換性 (commutativity),所以不管是 ((x) + (y))
或是 ((y) + (x))
都是作指標相加,因此這兩個述式所得到的結果是一樣的。
當然,類似 0[i]
這種寫法並不值得鼓勵,除非你是在參加 IOCCC 比賽。
參考:C FAQ: Question 6.11
2006-11-23
Array Subscripting in C
Posted by
JY
at
8:30:00 PM
Labels: programming
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment