我們有一個三字節數組象下面這樣:訪問數組的這兩種方法是否實現相同?
char charArray[3];
charArray[1]='a';
//or
char * charP=charArray;
charP[1]='a';
兩種方法用於訪問到陣列的第二元件,現在將它們以相同的方式通過編譯器或第一種方法實現將不涉及一個像第二種方法的指針?
我們有一個三字節數組象下面這樣:訪問數組的這兩種方法是否實現相同?
char charArray[3];
charArray[1]='a';
//or
char * charP=charArray;
charP[1]='a';
兩種方法用於訪問到陣列的第二元件,現在將它們以相同的方式通過編譯器或第一種方法實現將不涉及一個像第二種方法的指針?
他們將被以同樣的方式通過編譯器
可能實現。
如果使用數組名,下標是常量表達式,編譯器可以做很可能部分或全部在編譯時指針運算。使用指向數組的指針可能無法做到這一點;這可能取決於編譯器是否可以確定指針指向數組中的元素。
這只是猜測,但。確定給定的編譯器是否爲這兩者發出相同的代碼的唯一方法是查看該編譯器發出的代碼。
+1 ... Nitpick:「你的編譯器」發出的代碼沒有告訴任何「給定的編譯器」發出什麼...... ;-) – Kleist 2010-11-17 15:51:30
@Kleist:哈。哎呀。謝謝。 – 2010-11-17 15:52:46
語義上講,它們會表現一樣 - 第二個元素將被設置 - 但它沒有指定爲以編譯器將如何實現這一目標。
這是可能的編譯器可以選擇執行與偏移一個指針引用第一數組訪問,併爲第二個這樣做。另一方面,它可以優化本地分配的數組訪問並直接引用適當的內存位置 - 同樣,它可以對第二次訪問進行相同的優化,但它可能不會。它的選項取決於編譯的二進制平臺,以及它是否「意識到」數組或指針實際指向一個局部變量(您期望它)。
因爲你不能分辨無論如何,通常可以考慮他們是相同的,即使執行情況不同。
第二種方法可能會使編譯器生成更多的代碼。 charP是一個指針,需要一個變量,儘管使用少量的代碼可能會導致編譯器優化。
與CHARP,它是一個L值,你可以將它指向另一個位置,你可以用++增加它,等
來看看吧!
檢查你的編譯器使用不同的優化級別生成的彙編代碼。我保證你會學到很多東西。
編譯一下,看看反彙編的代碼。 ASM可能是一種痛苦的寫作,但它並不難以閱讀。 (OTOH,只會給你一個不確定的或明確的答案。) – BCS 2010-11-17 17:57:12