作者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