【单选】执行下列代码,输出是( )。
int a[5] = {1, 3, 5, 7, 9};
int *p = a + 2;
*(p - 1) = p[0] + p[2];
p[1] = *(a + 1) - a[0];
cout << a[1] << "," << a[3];先把 p 定位到 a[2],再用"p[i] 等价于 *(p+i)"逐条改写赋值语句,特别注意第一条赋值已经把 a[1] 改掉了,后面读 a[1] 要用新值。
算到第二条时仍用 a[1] 的原始值 3(未察觉第一条 *(p-1) = ... 修改的正是 a[1]),从而得到 2 而不是 13;或把 p[2] 误当成 a[3]。
本题考查指针算术与数组元素的等价改写。
初始:a = {1, 3, 5, 7, 9},p = a + 2,即 p 指向 a[2],于是有映射关系:
| 表达式 | 等价下标 | 初始值 |
|---|---|---|
*(p-1) / p[-1] | a[1] | 3 |
p[0] / *p | a[2] | 5 |
p[1] | a[3] | 7 |
p[2] | a[4] | 9 |
**第 1 句:*(p - 1) = p[0] + p[2]; 左边指向 a[1],右边 = a[2] + a[4] = 5 + 9 = 14。 → a[1] 变为 14,数组变为 {1, 14**, 5, 7, 9}。
**第 2 句:p[1] = *(a + 1) - a[0]; 左边指向 a[3];右边 = a[1] − a[0] = 14 − 1 = 13(注意 a[1] 已被上一步改成 14!)。 → a[3] 变为 13,数组变为 {1, 14, 5, 13**, 9}。
输出:cout << a[1] << "," << a[3]; → 输出 14,13,选 A。
p[i] 恒等价于 *(p + i);a[i] 恒等价于 *(a + i),指针与数组下标可以自由互换;