函数是什么
函数是由函数头、函数体和参数组成。函数可以理解为一个“加工厂”,参数相当于工厂所要加工的材料。要牢记形参是实参的一份临时拷贝,所以形参要和实参传入的类型一致,可以理解函数是为实现某一功能对代码所进行的封装,函数的使用极大减少了代码的冗余,提高了代码的可读性。
函数的作用域及生命周期
作用域:意思就是变量的有效范围,变量分为局部变量和全局变量,两者的最大差别是两者的作用域,局部变量的范围是所在的有效范围,而全局变量的范围为整个工程。
#include<stdio.h>
int a=20;
int main()
{
{
int a=10;
printf("a1=%d\n",a);
}
printf("a2=%d",a);
return 0;
}
上述案例可以看出局部变量只在其有效范围起作用。
生命周期:指的是创建内存到销毁内存的一个时间段。局部变量进入时周期开始出作用域生命周期结束,全局变量的生命周期是整个程序的生命周期。
static与extern的作用
![内存中各部分所存放内容示意图](https://img-blog.csdnimg.cn/direct/2d341d284b3b49d0881bc810d20df2d8.png)
栈区:一般存放的都是临时的,一般在函数调用后就会释放,但是经过static修饰时会改变变量的生命周期,使存放在栈区的局部变量变成存放在静态区的静态变量。
static的功能
①生命周期:静态变量的生命周期是整个程序的执行时间,直到程序结束。
②如果未明确初始化,则它们会被设置为0,而全局变量会默认为0。
③若定义在自定义函数内,当调用完自定义函数,其他变量会释放,static变量不会释放。
④静态变量的初始化只会在程序开始执行时进行一次。
⑤当修饰全局变量时,改变全局变量的连接属性,使外部连接属性变成内部连接属性,这种文件只能自己的.c文件使用其.c文件无法使用。
静态库的设置:
![](https://img-blog.csdnimg.cn/direct/cf01a9e33be649e7ab791f0b13073d7e.png)
静态库的使用:导入静态库#pragma comment (lib."库文件名.lib")
extern:用来声明外部符号
使用方法:extern 所声明的变量
函数的嵌套调用与链式访问
嵌套调用:函数之间的彼此调用,下面是函数嵌套调用所实现的一个通过函数实现计算某年某月有几天的一个代码案例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
//函数嵌套调用
//判断某年某月有几天
is_year(int y)//对年份进行判断
{
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
return true;
else
return false;
}
void handle_fun(int x,int m)
{
int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31};
if (is_year(x) && m == 2)//筛查出闰年二月
{
printf("%d", arr[m] + 1);
}
else
printf("%d", arr[m]);
}
int main()
{
int year = 0;
int month = 0;
scanf("%d %d",&year,&month);
handle_fun(year, month);
return 0;
}
链式访问:⼀个函数的返回值作为另外⼀个函数的参数,下面通过一个小小的案例进行阐述
#include <stdio.h>
int main()
{
printf("%d ", printf("%d ", printf("%d ", 24)));
return 0;
}
![](https://img-blog.csdnimg.cn/direct/59c92d5cfe97467e812111b1633d656a.png)
可能大家会好奇为什么是这种结果这其实与printf的返回值有关,printf返回的是打印在屏幕上的个数 。
函数的递归
递归:先递推然后回归,就是运用了“大事化小”的思想,递归调用并不能无限调用,递归调用层数过多时,会导致栈空间耗尽,从而引发栈溢出错误。此外,递归调用也会消耗大量的计算资源,可能会导致程序运行缓慢甚至崩溃
下面是递归调用的具体案例
个人观点:递归分为两种一种有返回值的递归,可采用“阶梯法”进行求解具体案例可看斐波拉契数列,第二种就是无返回值的递归,这种类型就是“先递后归”。下面具体分析一下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void fun(int n)
{
if (n > 9)
{
fun(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int m = 0;
scanf("%d", &m);
fun(m);
return 0;
}
![](https://img-blog.csdnimg.cn/direct/9ca4566f4540427a93780577909eff05.png)
总结
函数在C语言种也是一个非常有用的部分,函数实现的多文件,提高了团队的协作,并且代码的结构化提高了代码的可读性,以上是我个人对函数的总结,总结可能有一些不全面,希望各位友友可以积极指出。期待我们一同进步。