当前位置: 首页 > news >正文

C语言函数学习笔记

1. 函数的定义

函数(Function)是一个具有特定功能的代码块,通过函数名调用执行。函数可以接受参数并返回值,便于代码重用和模块化。

2. 函数的基本结构

一个函数的基本结构包括函数声明、函数定义和函数调用。

2.1 函数声明

函数声明也称为函数原型,用于告诉编译器函数的名称、返回类型和参数类型。

返回类型 函数名(参数类型 参数名, ...);

例如:

int add(int a, int b);

2.2 函数定义

函数定义包含函数的具体实现,包括函数体。

返回类型 函数名(参数类型 参数名, ...) {
    // 函数体
    return 返回值;
}

例如:

int add(int a, int b) {
    return a + b;
}

2.3 函数调用

函数调用是指在程序中使用函数名和参数来执行函数。

返回值 = 函数名(参数值, ...);

例如:

int sum = add(3, 5);

3. 函数的参数传递

3.1 值传递

在值传递中,函数接受参数的副本,对参数的修改不会影响原始数据。

void changeValue(int x) {
    x = 10;
}

int main() {
    int a = 5;
    changeValue(a);
    printf("%d\n", a); // 输出5,原始数据未被修改
    return 0;
}

3.2 引用传递

在引用传递中,函数接受参数的地址,对参数的修改会影响原始数据。

void changeValue(int *x) {
    *x = 10;
}

int main() {
    int a = 5;
    changeValue(&a);
    printf("%d\n", a); // 输出10,原始数据被修改
    return 0;
}

4. 函数的返回值

函数可以返回一个值,也可以不返回值。

4.1 返回值函数

返回值函数在函数定义中指定返回类型,并使用return语句返回值。

int add(int a, int b) {
    return a + b;
}

4.2 无返回值函数

无返回值函数的返回类型为void,不使用return语句返回值。

void printMessage() {
    printf("Hello, World!\n");
}

5. 递归函数

递归函数是指在函数内部调用自身的函数。递归需要一个终止条件,以避免无限递归。

int factorial(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

int main() {
    int result = factorial(5);
    printf("%d\n", result); // 输出120
    return 0;
}

6. 函数指针

函数指针是指向函数的指针,可以通过函数指针调用函数。

#include <stdio.h>

void hello() {
    printf("Hello, World!\n");
}

int main() {
    void (*func_ptr)() = hello; // 声明并初始化函数指针
    func_ptr(); // 通过函数指针调用函数
    return 0;
}

7. 标准库函数

C语言提供了一些常用的标准库函数,例如:

  • printf:格式化输出
  • scanf:格式化输入
  • strlen:计算字符串长度
  • strcpy:复制字符串
  • strcmp:比较字符串
  • malloc:动态内存分配
  • free:释放动态内存

8. 变量的存储类型

C语言提供了四种变量的存储类型,用于控制变量的生命周期、存储位置和作用域。

8.1 自动变量(auto)

自动变量是函数内的局部变量,默认存储类型为auto,在函数调用时创建,函数结束时销毁。

void function() {
    auto int a = 10; // 自动变量
    printf("%d\n", a);
}

8.2 静态变量(static)

静态变量在函数内定义时,使用static关键字,具有局部作用域,但在程序运行期间保持其值。

void function() {
    static int count = 0; // 静态变量
    count++;
    printf("Count: %d\n", count);
}

8.3 寄存器变量(register)

寄存器变量使用register关键字声明,提示编译器将变量存储在CPU寄存器中,以提高访问速度,但编译器不一定会采纳这个建议。

void function() {
    register int counter = 0; // 寄存器变量
    for (int i = 0; i < 1000; i++) {
        counter += i;
    }
    printf("Counter: %d\n", counter);
}

8.4 外部变量(extern)

外部变量在所有函数外部定义,具有全局作用域,使用extern关键字在其他文件中引用。

int globalVar = 100; // 外部变量

void function() {
    extern int globalVar;
    printf("Global Variable: %d\n", globalVar);
}

相关文章:

  • 【js面试】JavaScript中执行栈和执行上下文是什么?
  • GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库
  • 【C++11】 并发⽀持库
  • next.js-学习2
  • Python常用的15个标准模块
  • 如何选择适合项目的自动化测试工具?
  • Linux项目自动化构建工具-make/Makefile (linux第六课)
  • DeepSeek 助力 Vue 开发:打造丝滑的文本输入框(Text Input)
  • vue框架后遗症∶被遗忘的dom操作
  • DeepSeek R1模型提示语技巧:如何高效引导AI生成优质内容
  • 具有快慢思考的语言调节机器人操作
  • VXLAN与园区网络虚拟化
  • (六)趣学设计模式 之 代理模式!
  • 分割数组的最大差值
  • 无人机实战系列(番外一)本地图像+Apple ML Depth Pro
  • 算法-数据结构-图的构建(邻接矩阵表示)
  • 图数据库Neo4j面试内容整理-约束(Constraint)
  • C++面向对象编程技术研究
  • 6.1 - UART串口数据收发环回实验
  • 代码随想录第三十八天| 322. 零钱兑换 279.完全平方数 139.单词拆分 动态规划:关于多重背包,你该了解这些!
  • 新造古镇丨江浙沪重点打造的“水乡客厅”,古镇也能串着玩?
  • 特朗普与普京开始进行电话会谈,稍后还将致电泽连斯基
  • 上海蝉联全国中小企业发展环境评估综合排名第一
  • 专访|金七猫奖得主:以非遗为舟,在现实题材中疗愈与成长
  • 武汉警方通报一起故意伤害案件:1人死亡,嫌疑人已被抓获
  • 半数以上中国人都缺这几种营养,吃什么能补回来?