在C语言中定义 `void print_count(int a[10])`,并在函数体内计算 `sizeof(a) / sizeof(a[0])`。下列说法正确的是()。
在函数参数声明中,array of type会被调整为pointer to type。也就是说,print_count里的a本质上是int *,sizeof(a)得到的是指针本身的字节数,而sizeof(a[0])得到一个int的字节数,两者相除只形成平台相关的比值,不能还原调用方数组的元素个数。形参写[10]也不会把完整数组按值传进来。
选项分析
正确。形参a被调整为int指针,无法由sizeof(a)恢复原数组长度。
错误。结果取决于指针和int的大小,而且不代表数组元素数。
错误。sizeof按类型求大小,不像strlen那样遍历内容。
错误。普通的int a[10]形参不自动携带运行时长度校验。
本题为什么容易错
方括号里的10很有迷惑性,看起来像函数收到了固定长度数组。实际上普通数组形参只是给读者的接口提示之一,编译后的参数类型仍是指针。
简短答案
函数参数写成int a[10],sizeof(a)还能得到10个元素吗,正确答案是 A(该表达式通常不能得到10,因为形参数组声明会调整为指针类型)。在函数参数声明中,array of type会被调整为pointer to type。也就是说,print_count里的a本质上是int *,sizeof(a)得到的是指针本身的字节数,而sizeof(a[0])得到一个int的字节数,两者相除只形成平台相关的比值,不能还原调用方数组的元素个数。形参写[10]也不会把完整数组按值传进来。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 该表达式通常不能得到10,因为形参数组声明会调整为指针类型 | 本题正确答案 | 正确。形参a被调整为int指针,无法由sizeof(a)恢复原数组长度。 | 看到题干核心场景时优先联想到它 |
| 无论平台如何,该表达式都严格等于10 | 本题干扰项 | 错误。结果取决于指针和int的大小,而且不代表数组元素数。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| sizeof(a)会在运行时扫描数组直到遇到0 | 本题干扰项 | 错误。sizeof按类型求大小,不像strlen那样遍历内容。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 形参中的[10]会让函数自动拒绝少于10个元素的普通调用 | 本题干扰项 | 错误。普通的int a[10]形参不自动携带运行时长度校验。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 无论平台如何,该表达式都严格等于10:错误。结果取决于指针和int的大小,而且不代表数组元素数。
- sizeof(a)会在运行时扫描数组直到遇到0:错误。sizeof按类型求大小,不像strlen那样遍历内容。
- 形参中的[10]会让函数自动拒绝少于10个元素的普通调用:错误。普通的int a[10]形参不自动携带运行时长度校验。
知识点详解
C标准规定,参数声明为array of type时会调整为qualified pointer to type。因此即使形参写出固定大小,函数得到的仍是指向首元素的指针。sizeof应用于该参数时,得到调整后指针类型的大小。
备考速记
数组进函数只递门牌号,房间数要另外告诉它。
C语言 在sizeof场景中的作用
设计数组处理函数时,应同时传入元素数量,或使用带长度字段的结构体。仅靠指针无法知道原数组边界,也是许多越界访问的根源。
同类题怎么考
- 判断函数形参数组的实际类型。
- 分析sizeof在调用方数组和被调函数指针上的不同结果。
C语言 在程序员软考中的考法
先看数组名出现在哪:同一作用域的真实数组可用sizeof算总大小;一旦作为函数形参,先按指针判断。
解题思路
关键不在方括号里写了10,而在它出现的位置是函数形参。进入函数后a已经按指针处理,sizeof(a)只量到指针,选A。
考点定位
数组表达式通常会转换为指向首元素的指针;函数形参中的数组声明还会在类型层面直接调整为指针声明。调用方数组长度不会随指针自动传递。
易错提醒
- 在被调函数内用sizeof形参数组计算元素个数。
- 只传数组首地址,不传实际长度或结束条件。
- 把指向数组的指针int (*p)[10]与int *p混为一谈。
备考提示
- 把元素个数作为size_t参数一起传入函数,这是最直白的接口。
- 对照int a[10]、int *a和int (*a)[10]三个声明,分别说出a指向什么。
你可能还想了解
- 函数参数int a[10]是数组还是指针?
- 为什么sizeof形参数组不是数组大小?
- C函数怎样获得数组长度?
本文小结
函数形参int a[10]会调整为int指针,sizeof(a)只得到指针大小,不能由此计算调用方数组的10个元素。