作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] 關於指標變數
時間Wed Apr 27 03:30:44 2011
※ 引述《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