看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《watermay (如雲)》之銘言: : 現有變數宣告如下: : int intArray[3][2] = {{10,20},{15,25},{50,40}}; : int **intPtr1 = intArray; [Warning] initialization from incompatible pointer type intArray decay 成指標時, 值跟 &intArray[0][0] 是一樣的, 換 句話說: assert( (void*)intArray == &intArray[0][0] ); 對於 &intArray[0][0] 只能用星星取值一次, 所以此題正確應為: int *intPtr1 = (int*)intArray; : int *intPtr2 = &intArray[1][1]; : int *intPtr3[2] = &intArray[2]; intArray[2]的型態為 int[2], 若對它取址則得 int(*)[2], 所以 本題應為: int (*intPtr3)[2] = &intArray[2]; : intArray的記憶體位址是0x0008600; int為sizeof(int) = 4; 不考慮記憶體值不合法的情況下 : 試回答下列問題(如果是正確的敘述請寫出左邊變數的數值,錯誤請說明原因,但每題題 : 目是有關連性的): : (一)*intPtr2 = intArray[1][1]; 相等 : (二)intPtr1 + 1 = intArray[0]; 光看數值的話: assert( (void*)intPtr1 == (void*)intArray[0] ); 但因為左邊運算元有往後加的動作, 所以不相等 : (三)++intPtr1 = &intArray[1]; intPtr1 指向 intArray[0][1], 而論數值 &intArray[1] 為 intArray[1][0] 的位址, 不相等 : (四)*(*intPtr1 + 1) = intArray[1][0]; *intPtr1 的型態為int, 兩個整數相加除非代表特殊可存取的記憶 體位址, 否則無法對它做任何取值的動作, 不相等 : (五)*(*intPtr3 + 1) = intArray[2][1]; *intPtr3 的型態是 int[2], +1 之後型態變成 int*, 取值之後效 力等同於: int *p = *intPtr3; // 指到 intArray[2][0] int *p2 = p + 1; // p2 指到 intArray[2][1] 所以這邊是相等 : (黃色文字是我加上去的,題目好像有出錯) : 我的疑問:不知道題目是要判斷等號兩邊相等,還是要判斷是否為正確的語法(可以執行) : 我覺得答案是: : 1.相等 合法 : 2.不相等 不合法 : 3.不相等 不合法 : 4.不相等 合法(因為延續第三題) : 5.不相等 不合法 : 我不知道我的答案對不對,我也不知道我的觀念是否正確? : 麻煩各位大大們了,謝謝^^ 答案對不對跑一下程式就清楚了, 不過這樣視型態如無物的程式我 還是第一次看見 @_@! 出題的人是小學生嗎? 編得過才怪, 還敢拿 來考人... -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (04/27 03:35)
watermay:謝謝大大,不過國考的時候是「紙上」作業orz... 04/27 06:40
james732:考試是一回事,現在總可以先跑跑看吧...? 04/27 09:25
watermay:也是^^不過跑出來不見得知道怎麼解釋就是了@.@ 04/28 06:51