GESP 四级 · GESP 202312 C++ 四级 第 3 题

选择题 · 答案 D · 考点:函数

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

题目

下面 C++ 代码最后执行后输出是( )。

int fun1(int *n)
{
    return *n**n;
}
int main()
{
    int arr[10]={2};
    arr[1]=fun1(arr);
    cout<<arr[1]<<endl;
}
答案:D

考点

函数

解题思维

拿到题先别急着看函数,先盯数组初始化:int arr[10]={2} 只给第一个元素赋值 2,后面全 0。fun1 形参是指针,传入数组名时指向首元素,所以 *n 就是 arr[0]。算出 *n**n 的值,再把它赋给 arr[1],最后输出 arr[1] 即可。

常见错误

最容易掉进的坑是误以为{2}会让整个数组都变成 2,或者把指针当成数组整体传进去导致 *n 变成 arr[1] 甚至 arr[2]。还有人选 A 是因为把乘法算成加法,选 C 是把 arr[0] 和 arr[1] 的值搞混。命题人最爱用这种初始化列表的陷阱,让你以为数组里全是 2,其实只有第一个是 2,其余默认 0。

详细解析(节选)

考点定位

本题核心考的是指针与数组的传参机制以及数组初始化列表的语义。在 GESP 四级中,这类题常用来检验学生是否真正理解“数组名作为指针”以及“函数形参是指针时如何取值”。

概念澄清:数组初始化与指针传参

1. 数组初始化列表的“坑”

代码里写的是:

int arr[10] = {2};

很多初学者会直觉地认为:"{2}"是不是表示整个数组都填 2?或者以为只填了第一个元素,后面自动补 0? 事实是:C++ 的初始化列表是按顺序赋值的。{2} 只给 arr[0] 赋值为 2,剩下的 arr[1] 到 arr[9] 因为没有显式赋值,默认初始化为 0。 所以此时内存布局是:

2. 指针形参的指向

函数定义为:

int fun1(int *n)

形参 n 是一个指针,指向一个 int 类型的变量。当我们在 main 中调用 fun1(arr) 时,arr 作为数组名,其值就是数组首元素的地址(即 &arr[0])。因此,n 指向的是 arr[0],而不是整个数组,也不是 arr[1]。 所以,*n 就是 arr[0] 的值,也就是 2。

3. 函数体内的计算

函数体是:

return *n ** n;

这里 ** 是 GESP 四级中定义的“乘法”运算符(在标准 C++ 中是 *,但题目里用了 ** 表示乘法,可能是为了区分或强调)。所以 *n ** n 就是 (*n) * (*n),即 2 * 2 = 4。 函数返回 4。

4. 赋值与输出

回到 main 函数:

arr[1] = fun1(arr);

fun1(arr) 返回 4,所以 arr[1] 被赋值为 4。此时内存布局变为:

最后一行:

cout << arr[1] << endl;

输出的是 arr[1] 的值,即 4。

同考点真题

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