【题目】 考察函数执行过程以下代码的输出是什么?

void f(int arr[], int n) {
    cout << sizeof(arr);
}
int main() {
    int a[10];
    f(a, 10);
    return 0;
}

【选项】
A. 40
B. 10
C. 指针大小(如 4 或 8)
D. 编译错误

来源:https://123.hnai.net/v0fon

核心考点

数组作为函数形参的时候,int arr[] 等价于 int* arr,数组会退化为指针,不再是完整数组类型。

  • main 里面:int a[10]sizeof(a) = 10 * sizeof(int)。32位环境:40;64位环境:40。
  • 传到函数 f 中,arr 变成指针
    • 64位系统:指针占8字节 → 输出 8
    • 32位系统:指针占4字节 → 输出 4 > 现在竞赛环境(CSP‑J)一般是64位,标准答案输出:8

关键细节

  1. 形参书写 int arr[]int arr[100]int *arr 三者完全等价,括号里数字会被编译器直接忽略。
void f(int arr[100],int n){
    cout << sizeof(arr); //依然是指针大小,8
}
  1. 为什么main里sizeof(a)是40? a 在main中是真正数组类型 int[10]sizeof 获取整个数组总字节数。

易错坑

❌ 企图在函数内部用 sizeof(arr)/sizeof(arr[0]) 求数组长度,完全错误,得到的是指针大小除以int大小,不是数组元素个数。

所以传数组给函数,必须手动传入长度n

如何不退化?

用数组引用传参(竞赛很少考):

// arr绑定 int[10]类型数组,数组不会退化
void f(int (&arr)[10]){
    cout << sizeof(arr); //输出40
}

小练习题

int main(){
    int a[5];
    cout << sizeof(a) << endl;
    int *p = a;
    cout << sizeof(p) << endl;
    return 0;
}

64位输出:

20
8