十八、函数
18.1、定义与作用
在 C 语言中,函数(Function) 是程序的基本组成单元之一,用于将一段具有特定功能的代码封装起来,实现代码的模块化、复用性和可维护性。
通俗来讲,函数是一段能完成特定任务的独立程序代码,它可以接收输入(参数),对参数进行处理。如果需要返回值,就返回相应的结果。(输入参数 --- 处理参数 --- 返回结果(可有可无))
18.2、基本构成
函数返回值类型 函数名称 (参数列表) {
函数主体
}
- 函数返回值类型:是指函数返回值的数据类型,但有些函数不需要返回值,这种情况下就使用void关键字
- 函数名称:用户自定义的函数名称(也叫函数标识符),遵循标识符命名规则
- 参数列表:函数接收的参数,可以是0个或多个
- 函数主体:函数要执行的任务代码
示例说明:
// 有返回值的函数,返回值类型是int
int add(int a, int b) {
/*
add:函数名称
a: 第一个参数名称,类型为 int
b: 第二个参数名称,类型为 int
*/
int c = a + b;
return c; // 函数返回值,类型为 int
}
// 没有返回值的函数
void pt(int a) {
printf("%d\n", a);
}
18.3、函数的声明
当您在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。下面是函数声明的语法构成:
函数返回值类型 函数名称 (参数列表类型)
示例:声明一个函数add,接收两个整型参数
int add(int, int);
18.4、函数的定义
在声明函数之后,C 程序知道有这么一个函数的存在,但是不知道这个函数具体是用来做什么的。因此,函数的定义是必须的。下面是函数的定义示例,还是上面的add函数:
int add(int a, int b) // 这时需要注明参数类型和名称
{
return a + b
}
18.5、函数的调用
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:
#include "stdio.h"
int add(int, int); // 函数声明
int main() {
int a = 10, b = 20;
int c = add(a, b); // 函数的调用
printf("%d\n", c); // 输出30
return 0;
}
// 函数的定义
int add(int a, int b) {
return a + b
}
十九、变量的作用域
在 C 语言中,变量的作用域指的是变量在程序中的可见范围,也就是在哪些地方可以访问该变量。理解变量的作用域对于编写结构清晰、不易出错的程序至关重要。它决定了:
- 在程序的哪些部分(比如函数内、文件内、全局等)可以访问该变量;
- 变量的生命周期(即变量存在的时间)通常也与作用域密切相关。
下面是C语言中按照变量作用域对变量进行分类整合而成的表格:
|
类型 |
说明 |
作用域 |
生命周期 |
存储位置 |
|---|---|---|---|---|
|
局部变量 |
定义在函数或代码块内部的变量 |
仅在定义它的函数/代码块内部可见 |
从进入函数/代码块开始,到退出时销毁 |
栈区 |
|
全局变量 |
定义在所有函数外部的变量 |
在整个程序(多个源文件)中可见(可能需要 extern 声明) |
程序启动时创建,程序结束时销毁 |
静态存储区 |
|
静态局部变量 |
在函数内部用static 定义的变量 |
仅在定义它的函数内部可见,但生命周期贯穿整个程序运行期间 |
程序启动时创建,程序结束时销毁 |
静态存储区 |
|
静态全局变量 |
在函数外部用 static 定义的变量 |
仅在当前源文件中可见,其他文件不可见(即使使用 extern 也不行) |
程序启动时创建,程序结束时销毁 |
静态存储区 |
19.1、局部变量
- 定义位置:函数内部或复合语句(如 { } 代码块)内部。
- 作用域:仅在定义它的函数或代码块内部有效,出了这个范围就无法访问。
- 生命周期:当函数被调用时创建,函数返回时销毁。
- 默认存储类别:自动(auto,通常可省略)
#include <stdio.h>
void test() {
int x = 10; // x 是局部变量,只在 test 函数里有效
printf("x = %d\n", x);
}
int main() {
test();
// printf("%d", x); // 错误!x 在这里不可见(未定义)
return 0;
}
特点:
- 每次函数调用都会重新创建局部变量;
- 不同函数中可以定义同名局部变量,彼此互不影响;
- 若未初始化,值是随机(垃圾)值。
19.2、全局变量
- 定义位置:在所有函数外部定义的变量。
- 作用域:从定义的位置开始,一直到整个程序结束,在多个函数中都可以访问。
- 生命周期:程序启动时创建,程序结束时销毁。
- 默认存储类别:静态(static),但具有全局可见性。
#include <stdio.h>
int globalVar = 100; // 全局变量
void func1() {
printf("func1: globalVar = %d\n", globalVar);
}
void func2() {
printf("func2: globalVar = %d\n", globalVar);
}
int main() {
printf("main: globalVar = %d\n", globalVar);
func1();
func2();
return 0;
}
特点:
- 所有函数都可以访问该变量;
- 如果局部变量与全局变量同名,局部变量优先(就近原则);
- 全局变量一般用于多个函数共享的数据,但滥用会导致代码耦合性高,难维护;
- 若未初始化,默认值为 0(对静态/全局变量而言)。
19.3、静态局部变量
- 定义位置:在函数内部,使用关键字 static 定义。
- 作用域:仍然只在定义它的函数内部可见,和普通局部变量一样。
- 生命周期:程序运行开始时创建,程序结束时销毁,但它的值在函数多次调用之间保持不变(不会被销毁重置)。
- 存储位置:静态存储区(而非栈区)
#include <stdio.h>
void counter() {
static int count = 0; // 静态局部变量
count++;
printf("Count = %d\n", count);
}
int main() {
counter(); // Count = 1
counter(); // Count = 2
counter(); // Count = 3
return 0;
}
特点:
- 作用域仍局限在函数内;
- 但它的值在函数调用之间会保留(不会像普通局部变量那样每次都重新初始化);
- 常用于统计、缓存等需要在多次调用间保持状态的场景;
- 若未显式初始化,默认值为 0。
19.4、静态全局变量
- 定义位置:在所有函数之外,使用 static修饰的变量。
- 作用域:仅在定义它的源文件(.c 文件)中可见,其他源文件无法访问,即使使用 extern也不行。
- 生命周期:程序启动时创建,程序结束时销毁。
- 用途:用于限制全局变量作用域,避免与其他文件的同名全局变量冲突,提高模块封装性
#include <stdio.h>
static int hiddenVar = 42; // 仅在当前文件中可见
void show() {
printf("hiddenVar = %d\n", hiddenVar);
}
特点:
- 用于实现文件内部的共享数据,但对其他文件不可见;
- 有利于避免命名冲突,提高代码封装和安全性。
二十、作用域相关规则
20.1、就近原则
#include <stdio.h>
int x = 10; // 全局变量
int main() {
int x = 20; // 局部变量
printf("x = %d\n", x); // 输出 20,局部变量优先
return 0;
}
如果局部变量与全局变量同名,函数内访问时优先使用局部变量。
20.2、extern存储类
如果要在其他源文件中访问某个全局变量,可以使用 extern 声明,但 不能用于访问 static 全局变量。
// 第一个文件 file1.c
int global = 100;
// 第二个文件 file2.c
extern int global; // 声明这个全局变量在其他文件中定义
#include <stdio.h>
int main() {
printf("%d\n", global); // 输出 100
return 0;
}
531

被折叠的 条评论
为什么被折叠?



