GESP 四级 · GESP 202306 C++ 四级 第 12 题

选择题 · 答案 A

← 整套速查表 GESP 四级 全部真题

题目

以下哪个函数声明在调用时可以传递二维数组的名字作为参数?( )

答案:A

解题思维

二维数组传参时,数组名会退化为指向某一行(一维数组)的指针。编译器需要知道每行有多少列才能正确计算偏移量,所以形参必须固定第二维(列数),第一维可以省略。

常见错误

很多学生误选 D,把二维数组名当成指针的指针(二级指针)。其实二维数组名退化后是“指向长度为 N 的一维数组的指针”,类型完全不同。还有人觉得“数组退化为指针”就随便写两个空维度,忘了 C++ 函数形参至少需要固定一个维度,否则编译器无法判断元素大小。

详细解析(节选)

二维数组与多维数组:题库共考过 29 题,覆盖 6 个考试级别(2008-2026);逐年分布:2008 年 1 题、2011 年 1 题、2014 年 2 题、2019 年 1 题、2022 年 1 题、2023 年 1 题、2024 年 4 题、2025 年 5 题、2026 年 9 题、null 年 4 题;分赛事:GESP 四级 20 题、CSP 入门级 2 题、GESP 七级 2 题、NOIP 提高组 初赛 2 题、NOIP 普及组 初赛 2 题、GESP 八级 1 题

这道题考查的是函数参数传递中数组名的退化规则,以及编译器如何计算多维数组元素的内存偏移。命题人喜欢在这里挖坑,因为学生容易把“数组退化”简单理解为“变成指针”,从而误选 D 项,或者觉得只要写了数组名就能传,随便留空维度(如 C 项),完全忽略了编译器在底层做指针算术时,必须知道每行有多少个元素才能算出下一个元素的地址。

拿到这种题,先想清楚:二维数组在内存中是按行优先连续存放的。比如 int arr[5][3],所有元素从 arr[0][0] 到 arr[4][2] 依次排好。当把它传给函数时,数组名 arr 会退化为一个指针,但这个指针指向的不是单个 int,而是指向“长度为 3 的一维数组”(即指向 arr[0])。因此,函数形参的类型必须是 int (*)[3],也就是“指向长度为 3 的一维数组的指针”。为了匹配这个类型,形参声明里第二维(列数)必须写死,第一维(行数)可以省略,因为编译器不需要知道总行数就能算偏移量。

逐项看选项:

最阴险的坑在于,很多学生知道“数组退化=指针”,就以为 D 项也是对的,把二维数组当成指针数组(如 int *arr[])来理解,混淆了“二维数组名”和“指针数组”两个概念。其实指针数组传进来是 int * 类型的指针,而二维数组名退化后是 int (*)[N] 类型的指针,两者类型不同。

从考频看,二维数组相关题目虽然总数不多(29 题),但在 GESP 四级中占比高达 20 题,是四级重点常考点。近年来 2023-2026 年每年都有稳定出题,说明命题人持续在这个点设障。基于数据与经验预测,未来 GESP 四级仍可能继续以“数组传参退化类型”为核心考点,偶尔会结合指针运算或内存布局变形考查,比如问“数组名退化后指向什么”或“形参写错维度会怎样”。暂无足够依据预测具体年份或题型变化,但四级考生必须把这一条规则刻进脑子里:二维数组传参,第二维必须写死。

综上,正确答案是 A。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断