- 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程序至少有一个函数,即main(),即使是最简单的程序也可以定义附加函数。
当某个问题的算法涉及冗长而复杂的逻辑时,它会被分解成更小、独立且可重用的块。这些小的代码块在不同的编程语言中被称为不同的名称,例如模块、子程序、函数或方法。
您可以将代码分成单独的函数。如何将代码划分到不同的函数中取决于您,但逻辑上划分是使每个函数执行特定任务。
函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供函数的实际主体。
C标准库提供了许多内置函数,您的程序可以调用这些函数。例如,strcat()用于连接两个字符串,memcpy()用于将一个内存位置复制到另一个位置,以及许多其他函数。
C语言中的模块化编程
函数旨在执行作为整个过程一部分的特定任务。这种软件开发方法称为模块化编程。
模块化编程采用自顶向下的软件开发方法。编程解决方案有一个主例程,通过它调用更小的独立模块(函数)。
每个函数都是一个独立的、完整的、可重用的软件组件。当被调用时,函数执行指定的任务并将控制权返回给调用例程,可以选择性地连同其过程的结果一起返回。
这种方法的主要优点是代码变得易于理解、开发和维护。
C语言中的库函数
C语言提供许多包含在不同头文件中的库函数。例如,stdio.h头文件包含printf()和scanf()函数。类似地,math.h头文件包含许多函数,例如sin()、pow()、sqrt()等等。
这些函数执行预定义的任务,可以根据需要在任何程序中调用。但是,如果您找不到合适的库函数来满足您的目的,您可以自己定义一个。
在C语言中定义函数
在C语言中,有必要提供任何函数原型的向前声明。库函数的原型存在于相应的头文件中。
对于用户定义的函数,其原型存在于当前程序中。函数的定义及其原型声明应该匹配。
执行函数中的所有语句后,程序的流程返回到调用环境。函数可能随流程控制一起返回一些数据。
C语言中的函数声明
函数声明告诉编译器函数名称以及如何调用函数。函数的实际主体可以单独定义。
函数声明包含以下部分:
return_type function_name(parameter list);
对于上面定义的函数max(),函数声明如下:
int max(int num1, int num2);
参数名称在函数声明中并不重要,只需要它们的类型,因此以下也是有效的声明:
int max(int, int);
当您在一个源文件中定义一个函数并在另一个文件中调用该函数时,需要函数声明。在这种情况下,您应该在调用该函数的文件顶部声明该函数。
C语言中函数的组成部分
C编程语言中函数定义的一般形式如下:
return_type function_name(parameter list){ body of the function }
C编程中的函数定义由函数头和函数体组成。以下是函数的所有部分:
- 返回类型 - 函数可以返回值。return_type是函数返回值的数据类型。有些函数执行所需的操作而不返回值。在这种情况下,return_type是关键字void。
- 函数名称 - 这是函数的实际名称。函数名称和参数列表一起构成函数签名。
- 参数列表 - 参数(也称为参数)就像一个占位符。当调用函数时,您将值作为参数传递。此值称为实际参数或参数。参数列表是指函数的参数的类型、顺序和数量。参数是可选的;也就是说,函数可能不包含参数。
- 函数体 - 函数体包含定义函数作用的一组语句。
C语言中的函数应该有返回类型。函数返回的变量的类型必须是函数的返回类型。在上图中,add()函数返回int类型。
示例:C语言中的用户自定义函数
在这个程序中,我们使用了名为max()的用户自定义函数。此函数接受两个参数num1和num2,并返回两者之间的最大值:
#include <stdio.h> /* function returning the max between two numbers */ int max(int num1, int num2){ /* local variable declaration */ int result; if(num1 > num2) result = num1; else result = num2; return result; } int main(){ printf("Comparing two numbers using max() function: \n"); printf("Which of the two, 75 or 57, is greater than the other? \n"); printf("The answer is: %d", max(75, 57)); return 0; }
输出
运行此代码时,将产生以下输出:
Comparing two numbers using max() function: Which of the two, 75 or 57, is greater than the other? The answer is: 75
在C语言中调用函数
在创建C函数时,您会定义函数必须执行的操作。要使用函数,您必须调用该函数以执行已定义的任务。
要正确调用函数,您需要遵守函数原型的声明。如果函数被定义为接收一组参数,则必须传递相同数量和类型的参数。
当函数定义包含参数时,函数名前面的参数称为**形式参数**。当调用函数时,传递给它的参数是**实际参数**。
当程序调用函数时,程序控制权将转移到被调用的函数。被调用的函数执行定义的任务,当执行其返回语句或到达其函数结束的闭合大括号时,它将程序控制权返回给主程序。
示例:调用函数
要调用函数,只需将所需的参数与函数名一起传递即可。如果函数返回一个值,则可以存储返回的值。请看下面的例子:
#include <stdio.h> /* function declaration */ int max(int num1, int num2); int main (){ /* local variable definition */ int a = 100; int b = 200; int ret; /* calling a function to get max value */ ret = max(a, b); printf( "Max value is : %d\n", ret ); return 0; } /* function returning the max between two numbers */ int max(int num1, int num2){ /* local variable declaration */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
输出
我们将max()与main()一起保留,并编译了源代码。运行最终的可执行文件时,将产生以下结果:
Max value is : 200
C语言中的main()函数
C程序是由一个或多个函数组成的集合,但其中一个函数必须命名为**main()**,它是程序执行的入口点。
从main()函数内部,可以调用其他函数。main()函数可以调用库函数,例如printf(),其原型是从头文件(stdio.h)或代码中存在的任何其他用户定义的函数中获取的。
在C语言中,程序的定义顺序无关紧要。在一个程序中,无论main()是第一个函数还是其他位置,它都是入口点。
**注意:**在C语言中,任何函数都可以调用任何其他函数,并且可以调用任意次数。函数也可以调用自身。这种自调用的函数称为**递归函数**。
函数参数
如果函数要使用参数,它必须声明接受参数值的变量。这些变量称为函数的**形式参数**。
形式参数在函数内部的行为类似于其他局部变量,在进入函数时创建,在退出函数时销毁。
调用函数时,参数传递给函数有两种方式:
序号 | 调用类型和描述 |
---|---|
1 | 值传递
此方法将参数的实际值复制到函数的形式参数中。在这种情况下,对函数内部参数所做的更改不会影响参数本身。 |
2 | 引用传递
此方法将参数的地址复制到形式参数中。在函数内部,该地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响参数本身。 |
默认情况下,C语言使用**值传递**来传递参数。一般来说,这意味着函数内的代码无法更改用于调用函数的参数。