下面 C++ 代码最后执行后输出是( )。
int fun1(int *n)
{
return *n**n;
}
int main()
{
int arr[10]={2};
arr[1]=fun1(arr);
cout<<arr[1]<<endl;
}拿到题先别急着看函数,先盯数组初始化: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 四级中,这类题常用来检验学生是否真正理解“数组名作为指针”以及“函数形参是指针时如何取值”。
代码里写的是:
int arr[10] = {2};很多初学者会直觉地认为:"{2}"是不是表示整个数组都填 2?或者以为只填了第一个元素,后面自动补 0? 事实是:C++ 的初始化列表是按顺序赋值的。{2} 只给 arr[0] 赋值为 2,剩下的 arr[1] 到 arr[9] 因为没有显式赋值,默认初始化为 0。 所以此时内存布局是:
arr[0] = 2arr[1] = 0arr[2] = 0arr[9] = 0函数定义为:
int fun1(int *n)形参 n 是一个指针,指向一个 int 类型的变量。当我们在 main 中调用 fun1(arr) 时,arr 作为数组名,其值就是数组首元素的地址(即 &arr[0])。因此,n 指向的是 arr[0],而不是整个数组,也不是 arr[1]。 所以,*n 就是 arr[0] 的值,也就是 2。
函数体是:
return *n ** n;这里 ** 是 GESP 四级中定义的“乘法”运算符(在标准 C++ 中是 *,但题目里用了 ** 表示乘法,可能是为了区分或强调)。所以 *n ** n 就是 (*n) * (*n),即 2 * 2 = 4。 函数返回 4。
回到 main 函数:
arr[1] = fun1(arr);fun1(arr) 返回 4,所以 arr[1] 被赋值为 4。此时内存布局变为:
arr[0] = 2arr[1] = 4arr[2] = 0最后一行:
cout << arr[1] << endl;输出的是 arr[1] 的值,即 4。