本章学习链接如下:
1.函数的概念
函数是执行特定任务的自包含代码块,它可以接受输入,处理输入,并产生输出。函数的使用提高了代码的重用性、模块性和可读性。C语言中的函数可以分为两大类:库函数和用户定义函数。
2.函数基础语法
函数的定义通常包括四个主要部分:返回类型、函数名、参数列表(可选)和函数体。
返回类型 函数名(参数类型 参数名, ...) {
// 函数体
// 返回值(如果有的话)
}
(1)无返回值,无参数的函数
void sayHello() {
printf("Hello, World!\n");
}
(2)有返回值,有参数的函数
int add(int a, int b) {
return a + b;
}
(3)调用函数
在C语言中,调用函数时需要提供函数名和必要的参数(如果函数接受参数的话)。
sayHello(); // 调用无参数的函数
int result = add(5, 3); // 调用有参数的函数,并接收返回值
(4)参数传递
C语言支持两种参数传递方式:
- 按值传递:函数接收参数值的副本,对参数的修改不会影响原始数据。
- 按引用传递:通过传递参数的地址(通常使用指针),函数可以直接修改原始数据。
3.函数分类
根据返回值和参数的不同,函数可以进一步分类:
-
根据返回值:
- 有返回值函数:这类函数执行完毕后会返回一个值。返回值可以是
int
、float
、char
、void*
等类型。 - 无返回值函数:使用
void
关键字定义,不返回任何值。
- 有返回值函数:这类函数执行完毕后会返回一个值。返回值可以是
-
根据参数:
- 有参数函数:这类函数在定义时指定了一个或多个参数,调用时需要提供相应的实际参数。
- 无参数函数:这类函数在定义和调用时都不使用参数。
4.函数的作用
- 模块化:函数允许将程序分解为小的、管理得当的部分,从而提高程序的模块性。
- 重用性:一旦定义了一个函数,就可以在程序的多个位置多次调用它,提高代码的重用性。
- 易于维护:函数帮助将复杂的问题分解为简单的子问题,使代码更易于理解和维护。
5.库函数
库函数的学习和查看⼯具很多,⽐如: C 标准库头文件 - cppreference.com
这些是C标准库提供的函数,如printf()
、scanf()
、strcpy()
等,可以直接在程序中调用,无需用户自己定义。库函数是预先编写好的、可执行特定任务的函数集合,它们被编译并打包在标准库或其他库中。用户可以通过包含相应的头文件并在程序中调用这些函数来使用它们,无需自己重新编写这些功能的代码。头文件包含了库函数的声明、宏定义、类型定义等,是使用库函数的关键。
库函数提供了执行常见任务的预编写代码,例如输入输出操作、字符串处理、数学计算等。C标准库(libc
)是最基本的库,包含了语言核心的功能,如标准输入输出(stdio
)、字符串操作(string
)、数学运算(math
)等。
使用库函数的步骤:
- 包含头文件:在源代码文件的顶部包含一个或多个头文件,这些头文件声明了你打算使用的库函数。例如,使用
printf
或scanf
函数需要包含头文件<stdio.h>
。 - 调用函数:在程序中按需调用库函数。调用时需确保传递正确的参数,并接收函数返回的任何值(如果有的话)。
头文件
头文件是扩展名为.h
的文件,包含了C程序中可重用的声明和宏定义。头文件让我们能够将声明集中在一个地方,并在多个源文件之间共享。包含头文件主要有两个目的:
- 声明函数和变量:头文件中声明的函数和变量可以在包含了该头文件的源文件中使用。
- 引入宏定义和类型定义:头文件可以包含宏定义和类型定义,以便在多个源文件中复用。
使用头文件的语法:
#include <头文件名>
或者,如果是自定义的头文件,可以使用双引号:
#include "头文件名"
#include <stdio.h> // 包含标准输入输出头文件
#include <math.h> // 包含数学库头文件
int main() {
printf("Square root of 4 is: %f\n", sqrt(4)); // 调用 sqrt 函数计算 4 的平方根
return 0;
}
在这个示例中,<stdio.h>
头文件声明了printf
函数,用于输出;<math.h>
头文件声明了sqrt
函数,用于计算平方根。
6.用户自定义函数:
这些是程序员根据需要自己定义的函数,以执行特定的任务。
函数的形参(形式参数)、实参(实际参数)、以及return
语句是至关重要的。这些构成了函数调用和定义的基础,使得代码能模块化和重用。
(1)形参和实参
形参是在函数定义时指定的参数,它们作为占位符存在(需要用到这个函数的时候可以按需传入实际值),在函数被调用时接收实际的参数值。形参只在函数内部可见,并且其作用域仅限于函数体内。
实参是在调用函数时传递给函数的实际值,这些值将赋给对应的形参。
形参与实参之间的关系:当函数被调用时,每个实参的值会被复制给对应的形参。这种参数传递方式称为“按值传递”,意味着对形参的任何操作都不会影响实参的值。如下面这个示例所示:在这个例子中,x
和 y
是add
函数的形参,而a
和 b
是调用add
函数时的实参。a
的值被复制给了 x
,b
的值被复制给了 y
,因此在add
函数内部对x
和y
的操作不会影响a
和b
的值。
#include <stdio.h>
// 定义一个函数,它的形参是 x 和 y
int add(int x, int y) {
return x + y; // 返回 x 和 y 的和
}
int main() {
int a = 5, b = 3;
// 调用 add 函数,此时 a 和 b 是实参
int sum = add(a, b);
printf("The sum is: %d\n", sum);
return 0;
}
(2)return语句
return
语句用于从函数返回一个值到调用者。一个函数可以有多个return
语句,但只要执行到任何一个return
语句,函数就会结束执行并返回指定的值。
如果函数的返回类型为void
,则return
语句可以省略,或者单独写作return;
,表示函数到此结束执行并返回调用者。
如下示例:num
是isPositive
函数的形参,而number
是调用该函数时的实参。isPositive
函数通过return
语句返回一个整数,表示给定的数是否为正数。
#include <stdio.h>
// 定义一个函数,用于判断一个数是否为正数
// 这里的形参是 num
int isPositive(int num) {
if (num > 0) {
return 1; // 如果 num 是正数,返回 1
} else {
return 0; // 否则,返回 0
}
}
int main() {
int number = -5;
// 调用 isPositive 函数,number 是实参
if (isPositive(number)) {
printf("%d is positive.\n", number);
} else {
printf("%d is not positive.\n", number);
}
return 0;
}