【题目】 考察函数执行过程以下代码的输出是什么?
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. 编译错误
核心考点
数组作为函数形参的时候,
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
关键细节
- 形参书写
int arr[]、int arr[100]、int *arr三者完全等价,括号里数字会被编译器直接忽略。
void f(int arr[100],int n){
cout << sizeof(arr); //依然是指针大小,8
}
- 为什么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



