C语言基础入门(六)

十八、函数

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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackispy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值