作者SuperBEAR (bear)
看板NTUBIME96-HW
標題Re: [解答] 計程期末考解答
時間Tue Feb 3 21:05:00 2004
※ 引述《st3001 (pyrotechnics)》之銘言:
: : 第二題:(10分)
: : 下列敘述執行後變數 A, B, C, D, E 之值分別為何?
: : int x[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
: : x++;
: 這題答案其實是錯的耶XD
: x是陣列名稱不能(x++)...
: C:\Documents and Settings\user\My Documents\BIME\cpp\DATA1\DATA1.cpp(15) :
: error C2105: '++' needs l-value
well....你寫在考卷上那個我看到了,忘了說明.......@@
首先要有一個觀念:陣列跟指標其實是一樣的。
或者應該說,陣列其實就是包的比較好看的指標運作。
當我們宣告 int x[10]; 時,實際的動作是這樣的:
程式會跟系統要 10 個 int 大小,而且是連續的記憶體,
並且會多要一塊指標的大小,這個指標的型態是 int*,
內容是剛才那一大塊連續記憶體的第一個位置。
x 對 compiler 來說,代表的就是那個多要的指標。
x[3] 的意思,不光是 x 這個陣列的第 4 個元素而已,
它其實是 *(x+3) 的意思, [] 這個東西是一個 operator,
對 compiler 來說,當它看到 x[3] 時,會自動解譯成 *(x+3),
也就是 x 這個指標所指的位置往右移三個單位。
畫成圖的話,就是這個樣子:
指標 實際的陣列
┌─┐ ┌─┬─┬─┬─┬─
│ ┼─────→ 2│4 │6 │8 │ ……
└─┘ └─┴─┴─┴─┴─
↑ ↑ ↑ ↖
x *x *(x+1) *(x+2)
║ ║ ║
x[0] x[1] x[2]
所謂陣列名稱,其實就是那個指標,
所以理論上它是可以運算的,
x++ 的意思就是 x 現在改成指到原本位置右邊一個單位的記憶體。
所以新的 x[0] 就是舊的 x[1],新的 x[1] 就是舊的 x[2],依此類推。
但是這樣子做是很危險的一件事,
很可能會導致記憶體漂流,或是存取到不合法區間,
另外,當該陣列被釋放的時候,也可能會定址錯誤,
所以為了安全性的考量,許多 compiler 會把這種運算檔下來,
以避免不可預期的錯誤。
實際上可以這樣寫:
int* xptr = x;
xptr++;
然後 xptr[2] == x[3], xptr[-1] == x[0] .....
不過要小心不要指到不該指的地方去,
比如說 xptr += 10; 就爆了........
--
「
唉...好吧,我長話短說,」
「
你...比妲己強嗎?」
「
我絕對不會輸她」
「
因為我不會和她打!!!!!!!!!!!」
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.94.173
1F:→ Amanoyuri:我怎麼記得大一時課本裡有教... 推 218.174.135.57 02/07