3.2 举例:memset
我们依然对它进行验证,代码如下:
#include <stdio.h> #include <string.h> int main() { char arr[] = "hello world"; memset(arr, 'x', 5); printf("%s\n", arr); return 0; }
memory也是一个库函数,所以在使用的时候我们还是需要引头文件,怎么知道引哪个头文件呢?
A:依然是在左边的栏里面看
效果展示:
简单的总结,C语言常用的库函数都有:
1.IO函数
2.字符串操作函数
3.字符操作函数
4.内存操作函数
5.时间/日期函数
6.数学函数
7.其他库函数
4、 自定义函数
4.1 自定义函数意义:
Q:为什么有库函数还需要自定义函数?
A:因为库函数不能干所有的事情,所以更加重要的是自定义函数。
4.2 函数组成
自定义函数和库函数是一样的,也是有返回类型、函数名、参数,不同的是这些都是由我们自己定义的。
//自定义函数语法 ret_type fun_name(para1, *) { statement;//语句项 }//大括号括起来是函数体 //ret_type 返回类型 //fun_name 函数名 //para1 参数(可无可有可以多个)
4.3举例
例 1:找出两个数中的最大值
#include <stdio.h> int get_max(int x, int y) { return x > y ? x : y; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int max = get_max(a, b); printf("%d\n", max); return 0; }
效果展示:
例 2:写一个函数可以交换两个整型变量的内容
#include <stdio.h> void Swap(int x, int y)//形参 { int tmp = x; x = y; y = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a = %d b = %d\n", a, b); Swap(a, b);//实参 printf("交换后:a = %d b = %d\n", a, b); return 0; }
效果展示:
Q:我们写的是交换函数,为什么没有交换呢?
A:因为 a 和 b 是实参,x 和 y 是形参。函数被调用的时候形参只是实参的一份临时拷贝,所以对形参的修改是不会影响到实参的。这样的传参调用方式叫做传值调用。
实际参数(实参):
真实传递给函数的参数,叫实参。
实参可以是 常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只有在函数中有效。
改正的代码:
void Swap2(int* pa, int *pb)//这里是用指针变量接收的,因为实参传的是地址 { int tmp = *pa; *pa = *pb; *pb = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a = %d b = %d\n", a, b); Swap2(&a, &b);//这里的实参传的是地址,所以这样的叫传址调用 printf("交换后:a = %d b = %d\n", a, b); return 0; }
效果展示:
Q:这个代码实现了两个数的交换,这又是为什么呢?
A:改正过的代码传给函数的是地址,通过地址找到 a 和 b 的值,进而实现对 a 和 b 的交换。这样的传参调用方式叫做传址调用。
我们在这里对上面的两个代码进行分析:
上面的 Swap 和 Swap2 函数中的参数 x,y,pa,pb都是形式参数。在mian函数中给 Swap 的 a,b 和传给 Swap2 函数的 &a,&b 都是实际参数。
我们在这对函数的实参和形参进行分析:
这里我们可以看到Swap1函数在被调用的时候,x,y 和 a,b 的值是一样的,但是它们使用的空间是不一样的。所以我们可简单的认为:形参实例化之后相当于实参的一份临时拷贝。