目录
一、C语言中函数的分类
- 库函数
- 自定义函数
1.1库函数
库函数是C语言本身提供给我们的函数,使用库函数必须包含#include对应的头文件。
常用的库函数有:
- IO函数(输入输出函数)
- 字符串操作函数
- 字符操作函数
- 内存操作函数
- 时间/日期函数
- 数学函数
- 其他库函数
初学C语言时最常用的基本库函数为 #include<stdio.h>
1.2自定义函数
自定义函数和库函数一样,有函数名、返回值类型、函数参数。
函数的组成:
ret_type fun_name(para1,*)
{
statement; //语句项
}
//ret_type 返回类型
//fun_name 函数名
//para1 函数参数
其中,ret_type为返回类型,fun_name为函数名,para1为函数参数,大括号中的内容为函数体。
1.3实例
输出较大值的函数:
//定义函数
int get_max(int x, int y)
{
int z = 0;
z = (x > y ? x : y);
return z;
}
//调用函数
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = get_max(a, b);
printf("%d\n", m);
return 0;
}
不需要返回值的函数:
//定义函数
void menu()
{
printf("****** 1.Play *******\n");
printf("****** 0.exit *******\n");
}
//调用函数
int main()
{
menu();
return 0;
}
交换两个整型变量内容的函数:
//定义函数
void Swap(int* pa, int* pb)
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
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;
}
当函数调用时,实参传给形参,形参其实是实参的一份临时拷贝,因此对形参的修改,不会影响实参。如果需要修改实参的值,可以使用指针的方法。
二、函数的参数
2.1实际参数(实参)
实参指真实传给函数的参数,可以是常量、变量、表达式、函数等。
2.2形式参数(形参)
形参只能是变量。形参指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫做形式参数。形式参数当函数调用完之后自动销毁,因此只在函数内部有效。
三、函数的调用
3.1传值调用
函数的形参和实参分别占用有不同内存块,对形参的修改不会影响实参。
3.2传址调用
- 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
- 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。
四、函数的嵌套调用和链式访问
- 函数可以嵌套调用,但是不能嵌套定义。
- 把一个函数的返回值作为另外一个函数的参数。
五、函数的声明和定义
函数的声明一般出现在函数的使用之前,要满足先声明后使用。
声明一般放进.h文件中,使用时#include "xxx.h"。
定义一般放在.c文件中
//函数的声明
int Add(int x, int y);
int main()
{
int a = 10;
int b = 20;
int ret = Add(a, b);
printf("%d\n", ret);
return 0;
}
//函数的定义
int Add(int x, int t)
{
int z = x + y;
return z;
}
六、函数递归(recursion)
通俗点讲:递归九世纪函数自己调用自己。
例:接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4
void Print(unsigned int n)
{
if (n>9)
{
Print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);//1234
Print(num);
return 0;
}
递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。