函数
函数的分类:
1.库函数
2.自定义函数
1.库函数:
库函数种类:
- IO函数(IO:input output)
- 字符串操作函数(例如 strlen,计算字符串长度函数)
- 字符操作函数
- 内存操作函数
- 时间/日期操作函数(例如 time 函数)
- 数学函数(例如 sqrt 开平方函数)
- 其他库函数
注意:在使用库函数时,必须要包含 # include 对应的头文件。
例如,引用 strcpy 函数 和 string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello world";
char arr2[20] = "############";
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
将 arr 1 内的字符 拷贝到 arr 2 中。
2.自定义函数:
函数的组成:
ret _ type fun_name ( para1 , *)
{
statement ; // 语句项
}
ret_ type :返回类型
fun_name :函数名
para 1 : 函数参数
写一个函数可以交换两个整型的内容:
#include<stdio.h>
void Swap1 (int x,int y)
{
int tmp = 0;
tmp = x;
y = tmp;
}
int main()
{
int a = 20;
int b = 10;
printf("a=%d b=%d\n", a, b);
Swap1(a, b);
printf("a=%d b=%d\n", a, b);
return 0;
}
swap1 无法完成任务! swap1——传值调用
理论上这条代码可以交换 a,b 的值,可结果并不一样。我们经过检验得知,x,y 与 a,b 的地址并不相同,所以 xy 值的改变没有影响 ab 的值。
因此我们利用地址调用函数:
#include<stdio.h>
void Swap2 (int *pa,int *pb)
{
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 20;
int b = 10;
printf("a=%d b=%d\n", a, b);
Swap2(&a,& b);
printf("a=%d b=%d\n", a, b);
return 0;
}
swap2 可以完成任务! swap2——传址调用
此代码便可以交换 ab 的值。
函数的参数:
1. 形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
2. 实际参数(实参):
真实传给函数的参数,叫实参。实参可以是:常量,变量,表达式,函数等。无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传给形参。
上面 swap1 和 swap2 函数中的参数 x,y,pa,pb,都是形式参数。在 main函数中传给 swap1 的 a,b 都是实际参数。
结论: 当实参传给形参时,形参只是实参的一份临时拷贝,对形参的修改是不会影响实参的。
函数的调用:
一,传值调用:
- 函数的实参和形参占有不同内存块,对形参的改变不会影响实参
二,传址调用:
2. 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式
3. 这种传参方式可以让函数和函数外边的便量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
嵌套调用和链式访问:
一,嵌套调用:
可以实现函数中嵌套函数
#include<stdio.h>
void function1()
{
printf("love\n");
}
void function2()
{
int i;
for (i = 1; i <= 3; i++)
{
function1();
}
}
int main()
{
function2();
return 0;
}
例如这里我们想,打印三个“love”,只需要在主函数里引用 “ function 2 ”即可。
二,链式访问:
把一个函数的返回值作为另一个函数的参数
#include<stdio.h>
int main()
{
printf("%d\n", printf("%d", printf("%d", 43)));
return 0;
}
这条代码打印的结果是“ 4321 ”,因为 printf 函数的返回值是函数打印字符的个数,体现了函数的链式访问。
函数的声明和定义:
一,函数的声明:
- 要告诉编译器 有一个函数叫什么,参数是什么,返回类型是什么。但是具体存不存在,无关紧要。
- 函数的声明一般出现在函数的使用之前,要满足先声明后使用。
- 函数的声明一般要放在头文件中。
二,函数定义:
函数定义指函数的具体实现,交代函数功能实现。
函数声明的正确使用:
以加法函数举例:
#include<stdio.h>
int Add(int x, int y);//函数的声明
int Add(int x, int y)//函数的定义
{
int z = x + y;
return z;
}
int main()
{
int a = 20;
int b = 10;
int sum= Add(a, b);//函数调用
printf("%d\n", sum);
return 0;
}
但在使用中,我们需要将函数的声明放到头文件里,将函数的定义放到,加法函数的文件里
注意,我们在引用自己的头文件时,也是需要加上 “ # include “xxx.h” ",这里用的是双引号,而不是尖括号。
这样,我的"add.c"与"add.h"文件就组成了一个加法模块,日后可直接使用。