- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境设置
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策
- C语言 - 决策
- C语言 - if语句
- C语言 - if...else语句
- C语言 - 嵌套if语句
- C语言 - switch语句
- C语言 - 嵌套switch语句
- C语言中的循环
- C语言 - 循环
- C语言 - while循环
- C语言 - for循环
- C语言 - do...while循环
- C语言 - 嵌套循环
- C语言 - 无限循环
- C语言 - break语句
- C语言 - continue语句
- C语言 - goto语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 可变参数函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - 返回语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近、远和巨型指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查询表
- C语言 - 点(.)运算符
- C语言 - 枚举(enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位段
- C语言 - Typedef
- C语言中的文件处理
- C语言 - 输入与输出
- C语言 - 文件I/O(文件处理)
- C预处理器
- C语言 - 预处理器
- C语言 - 预处理指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言中的用户自定义函数
C语言中的函数是一块组织良好的、可重用的代码块,用于执行单个相关的操作。在任何C程序中,都存在一个或多个函数——分为库函数和用户自定义函数。
C语言中有两种类型的函数:
- 库函数
- 用户自定义函数
任何C编译器(例如GCC编译器、Clang、MSVC编译器等)都附带一些预编译的头文件(stdio.h、math.h等),每个头文件包含一个或多个预定义的库函数,例如printf()、scanf()、pow()、sqrt()等。为了能够使用库函数,必须使用#include指令提供相应的头文件。
但是,如果您找不到合适的库函数来满足您的需求,则可以为程序定义一个自定义函数。通常,我们会发现一个C程序包含一个main()函数。显然,main()函数是一个用户自定义函数,因为它包含用户提供的指令。当然,它也可以调用其他库函数或用户自定义函数。
什么是C语言中的用户自定义函数?
用户自定义函数由用户定义,用于执行特定任务以实现代码可重用性和模块化。要创建和使用用户自定义函数,不需要使用任何内置库。这些函数可以在同一个程序中创建,也可以在用户自定义的头文件中创建。
创建用户自定义函数
要创建用户自定义函数,首先需要了解函数的目的,即您希望函数执行什么操作?
要创建用户自定义函数,需要了解函数的以下三个部分:
- 函数声明
- 函数定义
- 函数调用
用户自定义函数的声明
在C语言中,必须提供任何函数原型的声明。库函数的原型位于相应头文件中。
对于用户自定义函数,其原型位于当前程序中。函数的定义及其原型声明必须匹配。
语法
如果您希望定义一个名为add()的函数,该函数执行两个整数参数的加法并将值作为整数返回,则函数声明如下:
int add(int, int);
用户自定义函数的定义
函数的定义及其原型声明必须匹配。定义包含与声明匹配的函数头和函数体。
语法
return_type function_name(arg1, arg2, ...){ // Function body; return val; }
示例
使用此模板,您可以编写如下所示的用户自定义函数add():
int add(int a, int b){ int c; c = a + b; return c; }
请注意,在C程序中,用户自定义函数的定义顺序并不重要。但是,必须在调用函数之前声明其原型。
在一个程序中,main()函数始终是入口点,无论它是第一个函数还是其他函数。我们不需要提供main()函数的原型声明。
调用用户自定义函数
要调用函数,应使用符合函数原型声明的语句。如果函数被定义为接收一定数量的参数,则必须传递相同数量和类型的参数来调用该函数。
示例
以下语句调用我们上面定义的add()函数:
int result = add(10, 20);
用户自定义函数示例
在此示例中,我们创建了两个用户自定义函数add()和sub()来查找给定数字的加法和减法。
// C program to demonstrate an example of // user-defined function #include <stdio.h> // Function declarations int add(int, int); int sub(int, int); // Function definitions int add(int a, int b) { return (a + b); } int sub(int a, int b) { return (a - b); } int main() { // Declaring two integer variables to // store the numbers // and resultant variables to store the result int num1 = 36, num2 = 24; int res_add, res_sub; // Calling the functions res_add = add(num1, num2); res_sub = sub(num1, num2); // Printing the results printf("Addition is : %d\n", res_add); printf("Subtraction is : %d\n", res_sub); return 0; }
Addition is : 60 Subtraction is : 12
用户自定义函数中的形式参数和实际参数
当函数定义带参数时,函数名前括号中的参数称为形式参数。在上面的示例中,函数定义带有“int a”和“int b”参数;它们是形式参数。
调用函数时,传递给它的参数称为实际参数。在下面的示例中,变量“x”和“y”是实际参数。
int x = 10, y = 20; int result = add(x, y);
用户自定义函数可以定义为具有任何类型的变量作为形式参数。它包括基本类型(int、float、char)、数组、指针或struct/union类型变量。
函数应向调用环境返回值。默认情况下,函数的返回类型为int类型。但是,它可以返回任何数据类型——基本类型、数组、指针或结构体以及指针。您甚至可以定义一个返回void类型的函数。
示例
如果函数的前向声明和定义中的实际参数和形式参数的数量或类型,或者返回类型不匹配,则编译器会报告错误。
请看下面的例子:
#include <stdio.h> float divide (int, int); int main(){ int x = 15, y = 5; float z = divide (x, y); printf("%f", z); return 0; } int divide (int a, int b){ int c = a/b; return c; }
输出
在上面的代码中,divide()函数的声明与其定义不匹配,因此编译器显示以下错误:
error: conflicting types for 'divide'
在C语言中,任何函数都可以调用任何其他函数,任何次数。函数也可以自己调用自己。这种自调用函数称为递归函数。
下面的程序从main()函数内部调用main()函数本身:
#include <stdio.h> int main(){ printf("Hello"); main(); return 0; }
执行时,程序进入无限循环。实际上,必须使用递归,以便程序最终终止。