Q152.
使用下列C++程式宣告,那些指令的輸出相同?
電腦軟體設計(C++) · 乙級 · C++ · Q152
難易度分析
4 / 5
本題涉及二維陣列的多種指標存取方式,包含指標衰變、陣列指標及記憶體位址運算的合法性判定。由於為複選題,且選項間的語法差異極其微小,要求考生必須精確區分不同指標型別的運算邏輯。
正確答案 (複選):①, ②, ④
- ① s1=&s[4][1]; cout <<s1[0]<<endl;:&s[4][1] 取得二維陣列第5列第2欄元素的位址,指派給指標 s1 後,s1[0] 即解參考該位址取得原始元素值 s[4][1],此為標準的指標算術運算應用。
- ② s1=s[4]; cout <<s1[1]<<endl;:s[4] 會衰變(decay)為指向第5列首元素的指標,指派給 s1 後,s1[1] 等同於 *(s1+1),即偏移一個元素位置後取值,結果同樣為 s[4][1]。
- ④ s2=&s[4] ; cout <<(*s2)[1]<<endl;:&s[4] 取得第5列的位址(型別為指向陣列的指標),指派給 s2 後,(*s2) 解參考得到該列陣列本身,(*s2)[1] 即存取該列第2個元素,結果為 s[4][1],此為陣列指標(pointer to array)的典型用法。
錯誤選項解析
- ③ s2=&(s+4); cout <<(*s2)[1]<<endl;:s+4 本身已是右值(rvalue)位址運算結果,對其再取位址 &(s+4) 會產生編譯錯誤,因為 C++ 不允許對右值使用 & 運算子。正確寫法應為 s2=s+4 或 s2=&s[4]。
Learning Tip
"本題核心考點為 C++ 陣列與指標的等價關係:s[i][j] 等價於 \*(*(s+i)+j)。常見陷阱在於混淆 &s[i](合法,取得列位址)與 &(s+i)(非法,對右值取位址)。另外需注意指標衰變(array decay)規則:陣列名稱在運算式中會自動轉換為指向首元素的指標,但對整個陣列取 & 時型別會變為指向陣列的指標,兩者在指標型別與步長計算上截然不同。"
學員答題分佈
①s1=&s[4][1]; cout <<s1[0]<<endl;0%
②s1=s[4]; cout <<s1[1]<<endl;0%
③s2=&(s+4); cout <<(*s2)[1]<<endl;0%
④s2=&s[4] ; cout <<(*s2)[1]<<endl;0%
此答題分佈是根據學員在 LongePass 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!