(原創) 為什麼陣列變數等於第一個元素的記憶體位址? (C/C++) (C)
在C/C++中,我們知道ia = &ia[0];但為什麼要這樣定義呢?
如以下的C/C++程式碼?
g = h + ia[8];
若以組合語言(MIPS)表示,另register $s1為g,$s2為h
lw $t0, 8($s3) #$t0 = ia[8]
add $s1, $s2, $t0 #g = h + ia[8]
add $s1, $s2, $t0 #g = h + ia[8]
組合語言如何抓到ia[8]呢?以$s3為base address,offset 8個單位後,將該位址的值放到register $t0。8在陣列ia[8]的8就可抓到,但base address呢?所以只好將base address放到ia這個陣列變數存放,這樣$s3就可直接從ia獲得。
Conclusion
C語言當初就是為了取代組合語言,所以很多機制都可以從組合語言看出C語言的設計,也由此看到C語言存取陣列的另外一種寫法,如ia[8]也可以寫成*(ia + 8);其實不就與組合語言lw $t0,8($s3)的思維一樣嗎?