"函数"考纲要求

核心考点 - 函数的定义及调用

高频考点:函数定义格式、函数调用方式(必考)
  • 掌握函数定义的完整格式:返回类型 函数名(参数列表) { 函数体; return 返回值; }
  • 掌握函数调用的语法:函数名(实参列表),实参与形参需类型、个数、顺序匹配
  • 理解无返回值函数(void类型)的定义和调用规范
  • 掌握有返回值函数的返回值接收方式

核心考点 - 函数声明和函数原型

高频考点:函数声明格式、函数原型作用(必考)
  • 掌握函数声明的语法:返回类型 函数名(参数类型列表);
  • 理解函数原型的作用:告诉编译器函数的名称、返回类型和参数类型
  • 掌握函数声明与函数定义的区别:声明无函数体,定义有函数体
  • 掌握函数声明的位置:可在main函数前或头文件中

核心考点 - 函数的嵌套及递归调用

高频考点:嵌套调用执行流程、递归调用条件(高频)
  • 了解函数嵌套调用的执行逻辑:外层函数调用内层函数,内层执行完返回外层
  • 了解递归调用的两个条件:递归公式 + 终止条件
  • 理解递归调用的执行过程:逐层调用,逐层返回
  • 掌握简单递归函数(如阶乘、斐波那契数列)的编写思路

核心考点 - 数组作为函数参数

高频考点:数组名传参、形参数组定义(必考)
  • 掌握数组作为函数参数的传递方式:传递数组首地址(地址传递)
  • 掌握形参数组的定义格式:函数名(类型 数组名[], 数组长度)
  • 理解数组传参的特点:函数内修改数组元素会影响原数组
  • 掌握数组遍历、求和、排序等功能的函数编写方法

核心考点 - 局部变量和全局变量

高频考点:变量作用域、生命周期(高频)
  • 了解局部变量:定义在函数/代码块内,作用域仅限于所在区域,栈内存存储
  • 了解全局变量:定义在所有函数外,作用域为整个程序,静态存储区存储
  • 理解局部变量与全局变量的命名冲突处理:局部变量优先
  • 掌握局部变量的初始化要求:未初始化的局部变量值随机,全局变量默认初始化为0

高频考点精讲

考点1:函数的定义及调用(必考)

考试频次:每次必考 | 分值占比:20-25分

核心要点:函数定义需包含返回类型、函数名、参数列表、函数体、返回语句;调用时实参与形参需匹配。

// 函数定义示例:计算两数之和
int add(int a, int b) { // 形参列表
    int sum = a + b;
    return sum; // 返回值,类型需匹配函数返回类型
}

int main() {
    int x = 10, y = 20;
    // 函数调用:实参传递给形参
    int result = add(x, y);
    printf("和为:%d\n", result); // 输出30
    return 0;
}
解题技巧:改错题中优先检查:①函数返回类型与return值类型是否一致 ②实参和形参的个数/类型是否匹配 ③无返回值函数是否写void ④函数调用是否有分号(无)。

考点2:函数声明和函数原型(必考)

考试频次:每次必考 | 分值占比:15-20分

核心要点:函数声明(原型)用于告知编译器函数的接口信息,需写在调用之前,无函数体,末尾加分号。

// 函数声明(原型):两种写法均可
int add(int, int); // 简化写法:只写参数类型
int add(int a, int b); // 完整写法:参数类型+参数名

int main() {
    int res = add(5, 3); // 调用前已声明,合法
    printf("%d\n", res);
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}
解题技巧:改错题中函数声明常见错误:①末尾漏分号 ②参数类型与定义不匹配 ③返回类型与定义不一致 ④声明在调用之后。

考点3:函数的嵌套及递归调用(高频)

考试频次:80%考题涉及 | 分值占比:15-20分

核心要点:嵌套调用是函数内调用其他函数;递归调用是函数调用自身,必须有终止条件避免死递归。

// 1. 嵌套调用示例
int sub(int a, int b) { // 子函数
    return a - b;
}
int calc(int x, int y) { // 外层函数
    return sub(x + 10, y); // 嵌套调用sub函数
}

// 2. 递归调用示例(计算n的阶乘)
int factorial(int n) {
    if (n == 1) { // 终止条件
        return 1;
    }
    return n * factorial(n - 1); // 递归调用自身
}
解题技巧:递归题解题口诀:先找终止条件(出口),再找递归公式(递推关系);嵌套调用执行顺序:先执行被调用函数,再返回调用处继续执行。

考点4:数组作为函数参数(必考)

考试频次:每次必考 | 分值占比:20-25分

核心要点:数组名作为参数传递的是首地址,形参数组无需指定长度,函数内修改数组元素会影响原数组。

// 数组作为参数:计算数组元素总和
int arraySum(int arr[], int len) { // 形参数组+长度参数
    int sum = 0;
    for (int i = 0; i < len; i++) {
        sum += arr[i]; // 修改数组元素会影响原数组
    }
    return sum;
}

int main() {
    int nums[] = {1,2,3,4,5};
    int length = sizeof(nums)/sizeof(nums[0]);
    int total = arraySum(nums, length); // 传递数组名(首地址)
    printf("数组总和:%d\n", total); // 输出15
    return 0;
}
解题技巧:数组传参易错点:①形参数组不能用sizeof计算长度,需单独传递长度参数 ②数组名是地址常量,不能赋值 ③函数内对数组的修改会直接作用于原数组(地址传递)。

考点5:局部变量和全局变量(高频)

考试频次:75%考题涉及 | 分值占比:10-15分

核心要点:局部变量作用域小、生命周期短;全局变量作用域大、生命周期长,默认初始化为0。

int global_var = 100; // 全局变量:所有函数可访问

void test() {
    int local_var = 10; // 局部变量:仅test函数内可用
    global_var += local_var; // 全局变量可被修改
    printf("局部变量:%d\n", local_var); // 输出10
}

int main() {
    test();
    printf("全局变量:%d\n", global_var); // 输出110
    // printf("%d\n", local_var); // 错误:局部变量不可访问
    return 0;
}
解题技巧:变量作用域判断技巧:①看定义位置(函数内=局部,函数外=全局) ②局部变量未初始化值随机,全局变量默认0 ③同名时局部变量覆盖全局变量 ④局部变量存储在栈区,全局变量在静态区。

实战解题训练

例题1:函数定义与调用改错 中等

考点定位:函数定义格式 + 调用规范(考试重点题型)

题目:找出以下程序中的错误并改正(考试常考题型,分值20分)

// 错误程序
#include <stdio.h>
void printMsg() {
    printf("Hello Function!")
    return 0;
}

int main() {
    printMsg(10); // 调用函数
    return 0;
}

错误分析与改正

  1. printf行末尾漏分号 → 修正为:printf("Hello Function!");
  2. void类型函数不能有return 0 → 修正为:删除return 0; 或改为return;
  3. 调用printMsg时传递了实参10 → 修正为:printMsg(); (函数定义无参数,调用不能传参)
解题技巧:函数改错题检查优先级:①返回类型与return匹配性 ②参数列表与调用实参匹配性 ③语法错误(分号、括号) ④函数体逻辑。

例题2:函数声明(原型)判断 简单

考点定位:函数声明格式(考试高频题型)

题目:以下哪个是合法的函数声明?(分值15分)

已知函数定义:int max(int a, int b) { return a>b?a:b; }

A. int max(int a, int b) B. int max(int, int); C. int max(a, b); D. max(int a, int b);

答案:B

解析

  • A错误:是函数定义(有{}),不是声明(声明需末尾加分号)
  • B正确:函数声明简化写法,只写参数类型,末尾有分号
  • C错误:未指定参数类型
  • D错误:缺少返回类型
解题技巧:函数声明判断三步法:①有返回类型 ②有函数名和参数类型 ③末尾有分号;参数名可省略,类型不可省略。

例题3:数组作为函数参数编程题 较难

考点定位:数组传参 + 函数设计(考试压轴题型,分值20分)

题目:编写一个C程序,定义函数实现数组元素逆序存放,要求符合程序设计规范。

参考答案

// 程序功能:数组元素逆序存放
// 符合函数设计规范:数组传参+功能封装
#include <stdio.h>

// 函数声明:数组逆序函数
void reverseArray(int arr[], int len);

int main() {
    int nums[] = {1,2,3,4,5};
    int length = sizeof(nums)/sizeof(nums[0]);
    // 调用逆序函数
    reverseArray(nums, length);
    // 输出逆序结果
    for (int i=0; i         printf("%d ", nums[i]); // 输出5 4 3 2 1
    }
    return 0;
}

// 函数定义:数组逆序实现
void reverseArray(int arr[], int len) {
    int temp, i, j;
    for (i=0, j=len-1; i         temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
解题技巧:数组类编程题得分要点:①函数封装功能(单一职责) ②数组传参+长度参数 ③声明与定义匹配 ④注释清晰说明功能 ⑤语法无错误(分号、括号配对)。

C语言函数考点闯关游戏(满分100分)

当前关卡: 1/10
得分: 0/100
1关 - 高频考点

C语言函数定义的正确格式是?

恭喜你完成所有考点关卡!

你的最终得分是: 0/100

得分等级:

你已经掌握了函数的核心考点!