3.函数
3.1 函数是什么
函数是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。在C语言中,子程序是由一个主函数和若干个函数构成的。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。
3.1.1 函数分类
- 自定义函数
- 库函数
3.2 库函数
一般是指编译器提供的可在C源程序中调用的函数。分为两类,C语言标准规定的库函数和编译器特定的库函数。
3.2.1 网站
Learn C and C++ Programming - Cprogramming.com
https://docs.microsoft.com/en-us/cpp/c-runtime-library/c-run-time-library-reference?view=msvc-170
3.2.2 strcp
3.2.3 memset
3.3 自定义函数
// 格式:
ret_type func_name( parameter list )
{
body of the function
}
// return_type 函数的返回类型
// function_name 函数名称
// parameter list 参数列表
// body of the function 函数体
// 当函数不返回任何类型,ret_type为关键字void
-
实例
void Swap(int* pa, int* pb) { int z = 0; z = *pa; *pa = *pb; *pb = z; } int main() { int a = 10; int b = 20; printf("交换前 a=%d, b=%d\n", a, b); Swap(&a, &b); printf("交换后 a=%d, b=%d\n", a, b); }
-
重点
void Swap(int* pa, int* pb) { int* z = NULL; printf("%p %p %p\n", pa, pb, z); z = pa; pa = pb; pb = z; printf("%p %p %p\n", pa, pb, z); } // 不能通过交换a、b的地址交换a、b的数据 int main() { int a = 10; int b = 20; printf("交换前 a=%d, b=%d\n", a, b); Swap(&a, &b); printf("交换后 a=%d, b=%d\n", a, b); }
3.4 函数参数
3.4.1 实际参数(argument)
真实传递给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行调用时,它们都必须有确定的值,以便把这些值传送给形参。
3.4.2 形式参数(parameter)
形式参数是指函数名后括号中的变量,因为形参只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成后就自动销毁。因此形式参数只在函数中有效。
3.4.3 形参实例化之后其实相当于实参的一份临时拷贝。
3.5 函数调用
3.5.1 传值调用
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
3.5.2 引用调用
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
3.6 函数的嵌套调用和链式访问
3.6.1 嵌套调用
在函数A()中调用函数B()
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
// 最简单的嵌套调用,在main函数中调用prinf函数
3.6.2 链式访问
把一个函数的返回值作为另一个函数的参数。
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
printf("输出:%d\n", add(3, 4));
}
// 将add(3, 4)的返回值作为参数,传递给printf函数
3.7 函数的声明和定义
3.7.1 声明
告诉编译器函数名称及如何调用函数。
return_type function_name( parameter list );
// 在函数声明中
// 参数的名称并不重要
// 只有参数的类型是必需的
// 因此可省略声明中形参的名称
3.7.2 定义
return_type function_name( parameter list )
{
body of the function
}
3.8 函数递归
函数对自身的调用。
- 递归的必要条件
- 递归调用的过程
- 递归终止的条件
3.9 小知识
#include " " 与 <>有什么区别?
// 若 #include "" 查找成功,则遮蔽 #include <> 所能找到的同名文件
// 否则再按照 #include <> 的方式查找文件
// #include <> 的查找位置是标准库头文件所在目录
// #include "" 的查找位置是当前源文件所在目录
// <>先去系统目录中找头文件,如果没有在到当前目录下找
// ""首先在当前目录下寻找,如果找不到,再到系统目录中寻找
C语言函数默认返回类型
// C语言中函数如果没有定义返回值类型,则默认返回类型是int