程序员 · 高频练习

函数参数写成int a[10],sizeof(a)还能得到10个元素吗?

初级 单选题 第 1145 题 较难 程序员C语言数组参数指针sizeof
题目

在C语言中定义 `void print_count(int a[10])`,并在函数体内计算 `sizeof(a) / sizeof(a[0])`。下列说法正确的是()。

A 该表达式通常不能得到10,因为形参数组声明会调整为指针类型
B 无论平台如何,该表达式都严格等于10
C sizeof(a)会在运行时扫描数组直到遇到0
D 形参中的[10]会让函数自动拒绝少于10个元素的普通调用
题目类型:原创高频练习题 用途:用于帮助理解程序员相关考点和答案解析,不等同于官方真题。
正确答案
A
答案解析

在函数参数声明中,array of type会被调整为pointer to type。也就是说,print_count里的a本质上是int *,sizeof(a)得到的是指针本身的字节数,而sizeof(a[0])得到一个int的字节数,两者相除只形成平台相关的比值,不能还原调用方数组的元素个数。形参写[10]也不会把完整数组按值传进来。

选项分析

A

正确。形参a被调整为int指针,无法由sizeof(a)恢复原数组长度。

B

错误。结果取决于指针和int的大小,而且不代表数组元素数。

C

错误。sizeof按类型求大小,不像strlen那样遍历内容。

D

错误。普通的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个元素。