以下哪个函数声明在调用时可以传递二维数组的名字作为参数?( )
二维数组传参的核心在于‘退化’:数组名在函数参数中会退化为指向其首元素的指针。先想清楚二维数组的首元素是什么类型,再匹配参数声明是否等价,就能一眼锁定答案。
学生常误以为二维数组名传参时可以省略所有维度,或者混淆‘指针数组’与‘指向数组的指针’。其实内层维度必须保留,否则编译器无法计算步长;而指针数组和指针的指针对应的是非连续存储,与题目要求的连续内存不匹配。
【考点】二维数组传参退化规则与类型匹配
二维数组在内存中是连续存放的,按行优先排列。比如int a[3][4],它的首元素是a[0],而a[0]本身是一个包含4个整型的一维数组。当把二维数组名作为实参传递时,它会自动退化为指向这个一维数组的指针,即类型为int (*)[4]。因此,函数形参必须声明为能接收这种指针的类型,且必须显式写出最内层维度的大小,否则编译器无法确定每行有多少个元素,也就无法正确计算地址偏移。
【命题视角】命题人特意把这道题放在GESP四级,就是要考察对‘退化’本质的理解。很多考生死记‘二维数组传参要写两个维度’,却搞不清为什么必须写内层维度、外层可以省略。这道题用四个极具迷惑性的选项,分别对应‘缺内层维度’‘指针数组’‘指针的指针’三种典型错误认知,测试学生能否透过现象看本质。
【解题心法】拿到题先别急着看选项,脑子里过一遍:二维数组名退化后是什么类型?它的‘首元素’是什么?如果是int a[3][4],首元素是长度为4的一维数组,所以退化类型是int (*)[4]。再看哪个选项的形参类型与之等价。等价有两种写法:一是int a[][4](外层省略,内层必须保留),二是int (*p)[4](显式声明指向数组的指针)。选项Avoid BubbleSort(int a[3][4]);虽然写了外层维度,但它依然等价于int (*)[4],完全匹配。选项Bint a[][]缺内层维度,编译不过;Cint *a[]是‘指针数组’,每个元素是指针,类型完全不同;Dint **a是‘指针的指针’,对应的是非连续内存,也不对。
【避坑提醒】最容易掉进C和D的坑。C项利用的是‘*与[]位置互换’的视觉混淆,学生看到两个星号和两个方括号,误以为和二维数组有关,其实那是‘指针数组’,用来存放多个指针,和连续存储的二维数组风马牛不相及。D项则把‘数组到指针’偷换成了‘指针到指针’,命题人就是想卡住那些只背口诀、不懂内存布局的考生。记住:二维数组名退化成‘指向一维数组的指针’,不是‘指向指针的指针’。
【考频与趋势】二维数组与多维数组在题库中总共考过29题,覆盖6个级别。从逐年分布看,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题。数据表明,二维数组传参退化规则是GESP四级的高频考点,且近年(2024-2026)出题频率明显上升,从2024年的4题增至2026年的9题,说明命题组在加大对该知识点的考核力度。
【预测】基于现有数据,二维数组传参退化规则在未来GESP四级考试中仍将是必考题,且更可能以‘辨析形参类型’或‘计算偏移量’的形式出现。暂无足够依据预测是否会扩展到三维数组或动态二维数组的传参,因为题库中尚未出现相关题目。考生应重点掌握‘退化类型推导’和‘形参等价判断’这两步,做到看到二维数组名就能立刻说出它的退化类型,并迅速匹配正确的形参声明。