文章目录
前言
C语言中的函数就是完成某个功能的一小段代码。
C语言就是由很多个函数组成的。
C语言一般分为库函数和自定义函数。
今天主要是讲解自定义函数。
一、库函数是什么?
标准库和头文件
C语言国际标准ANSI C规定了一些常用的函数的标准,称为标准库。
由不同的编译器厂商实现,称为库函数。
不同的库函数需要包含不同的头文件
库函数相关头⽂件:https://zh.cppreference.com/w/c/header
二、自定义函数
语法形式:
函数返回类型 函数名 (形式参数)
{
函数体;
}
1.例:
代码如下(示例):
//int x . int y就是形参 Add前面的int就是返回类型,表示这个函数返回一个整数,返回类型也可以是void(空类型)就是什么都不返回,什么都不返回就不需要写return。{}里面的就是函数体。
#include <stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
} //这个就是函数
int main()
{
int a = 0;
int b = 0;
//输⼊
scanf("%d %d", &a, &b);
//调⽤加法函数,完成a和b的相加
//求和的结果放在r中
int r = Add(a, b);//这里面的a和b都是实际参数,简称实参
//输出
printf("%d\n", r);
return 0;
}
上述代码中的a和b都是实参,形参实际上是根据实参的类型创建的
2.形参和实参的关系
我是对上面代码为例

可以看出a和b x和y四个地址都不相同可以看出形参和实参在内存上存储位置也不同x和y就是对a和b的值进行了临时拷贝,地址其实不一样。修改形参其实不影响实参。
上面的Add函数被调用完内存其实就被收回了。
其实形参也可以是int a, int b.
下面图片是实参的地址

下面图片是形参的图片

上面两张图片a和b的地址不一样,因为下面那张是形参的地址,形参的作用域只作用于那个形参的函数,出来了就被释放了。
其实就是实参只是把值传过去了,到了另外一个函数,然后创建了新的两个内存空间,把值放里面,跟主调函数(main函数)中的a和b一点关系也没。
3.return语句
return语句后面可以是一个表达式也可以是一个值。
当返回类型为void类型时,可以不写return语句。
函数默认的返回类型为int
4.数组做函数参数
当数组做一个函数的实参是传递过去的是数组名,以下面代码为例,传递的是arr。
形参和实参为同一个数组。
void set_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = -1;
}
}
void print_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
set_arr(arr, sz);//设置数组内容为-1
print_arr(arr, sz);//打印数组内容
return 0;
}
数组名在sizeof里面代表的是整个数组的总大小,在其他地方代表的就是首元素地址。把数组名传过
去就是把地址传过去,所以形参不需要向内存申请空间,修改形参其实就是修改实参。
如果传过去的是一维数组大小可以省略不写,是个二维数组行可以省略,列不可以省略。
函数的声明和定义
void set_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = -1;
}
}//这就是函数的定义
void set_arr(int , int )//这就是这个函数的声明。
当在main函数中调用函数时:
函数的声明一定要放到main函数的前面,这时函数的定义可以放到main函数的后面也行
如果没有声明,函数定义一定要放到main函数前面。
static和extern
static修饰
static是静态的意思,static修饰局部变量,会增加其生命周期。
也就是出了这个函数的作用域,地址也不会被内存收回。只有等程序结束才被收回
如果一个变量被static修饰了,那么这个变量只能在本源文件使用,不能在其他文件使用。
extern声明
extern是声明外部符号。
如果一个符号在A文件被定义,需要在B文件被使用,则需要用extern声明。
A文件:
int a =205;
B文件:
extern int a = 2025;
如果文件被static修饰了,则不能用extern声明。
函数递归
函数递归其实是解决问题的一种方法。
递归就是函数自己调用自己
#include <stdio.h>
int main()
{
printf("hehe\n");
main();//main函数中⼜调⽤了main函数
return 0;
}
//这个就是一个函数递归函数,不过这个是一个死循环。
递归的思想
递归就是把一个大问题递推下去变成一个小问题,再递推下去变成一个小小问题,直到递推不下去,再回归。就是把大事化小。
递:就是一直往下递推的意思
归:回归的意思。
!!先递完才回归。
递归的条件:
递归必须有一个限制条件,而且每一次递推必须无限接近这个限制条件,当满足这个条件时,就不递推开始回归。
举例
求n的阶乘:
int add(int x)
{
if (x == 0)
return 1;
else
return (add(x - 1) * x);
}
int main()
{
int a = 0;
scanf("%d", &a);
int r = add(a);
printf("%d", r);
return 0;
}
这个函数就是用递归的方式解决的。
当输入a=5时;

232






