一个数组定义为 int a[5] = {1, 2, 3, 4, 5};,一个指针定义为 int *p = &a[2];,则执行 *p = a[1]; 后,数组 a 中的值会变为( )。
这题考指针解引用和数组下标赋值。拿到题先别急着看选项,先把指针 p 到底指向数组的哪个位置(下标几)搞清楚,再看它要赋给谁的值,最后确认只有被指向的那个位置变了,其他元素纹丝不动。
最容易掉进'下标从1开始'的坑,把 a[2] 当成第三个元素却误以为指向下标 3,或者混淆指针和数组名。还有学生看到* p=...就以为是把 p 这个指针变量赋了值,忘了* p 是取 p 指向地址里的内容。另外,有些同学会惯性思维觉得赋值后数组会整体平移或者把 a[1] 也改了,其实只有 p 指向的那一个位置变了。
GESP 四级「指针与数组」模块,命题人专盯'指针解引用后对数组特定位置赋值'这一高频易错点,卡住大量考生对'指针指向哪个下标'与'数组下标从 0 开始'的混淆——看到* p = ... 就下意识想'把 p 这个指针赋了值',或者误以为 a[2] 是第三个元素却当成下标 3。
先确认 p 指向哪里:p = &a[2],& 取地址,p 指向数组第 3 个元素,即下标 2;再确认赋什么值:a[1] 是第 2 个元素,值为 2;最后执行赋值:*p = a[1] 就是把 a[1] 的值 2 赋给 p 指向的位置 a[2]。通法:遇到* ptr = arr[i] 先确认 ptr 指向哪个下标,再确认 arr[i] 是哪个值,赋值后只有被指向的那个位置变化,其余元素不动。
A 正确:第 3 个位置(下标 2)变成第 2 个的值 2,数组变为{1,2,2,4,5}。B 错:误以为 a[1] 变成 a[2] 的值,但 a[1] 本身不变。C 错:把 a[2] 变成 a[1] 的值,却同时把 a[3] 变成 a[2] 的值,多改了一个。D 错:把 a[2] 变成 a[3] 的值,方向反了。最阴险的陷阱是'只记住结论不推导',看到* p = a[1] 就下意识想'把 a[1] 的值赋给 p 指向的位置',结果选错答案。
若改成 p = &a[3]; *p = a[1]; 则数组变为{1,2,3,1,5};若改成 a[1] = *p; 则变成{1,2,3,4,5}不变,因为 a[1] 本来就是 2。刷到类似题先问自己:'命题人想考我的是指针指向哪个下标,还是赋值后哪个位置变了?'
复合类型:题库共考过 146 题,覆盖 7 个考试级别(2023-2026);逐年分布:2023 年 21 题、2024 年 42 题、2025 年 47 题、2026 年 27 题、null 年 9 题;分赛事:GESP 五级 52 题、GESP 三级 22 题、GESP 七级 21 题、GESP 六级 21 题、GESP 八级 16 题、GESP 四级 12 题、CSP 入门级 2 题。一维数组:题库共考过 224 题,覆盖 9 个考试级别(2008-2026);逐年分布:2008 年 3 题、2009 年 5 题、2012 年 1 题、2013 年 2 题、2015 年 1 题、2016 年 2 题、2017 年 1 题、2019 年 2 题、2021 年 1 题、2022 年 1 题、2023 年 27 题、2024 年 48 题、2025 年 55 题、2026 年 59 题、null 年 16 题;分赛事:GESP 五级 59 题、GESP 四级 42 题、GESP 三级 32 题、GESP 六级 26 题、GESP 七级 25 题、GESP 八级 19 题、NOIP 提高组 初赛 10 题、CSP 入门级 6 题、NOIP 普及组 初赛 5 题。
暂无足够依据预测未来可能怎么考。