1、函数?
- 是一个子程序
- 相较于其他代码具有独立性。
- 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏,这些代码通常被集成为软件库
函数的分类: 库函数 自定义函数
1.1 定义函数
类型 函数名( 形参(变量) )
{
返回值;
}
在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
- 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
- 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
- 函数主体:函数主体包含一组定义函数执行任务的语句。
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
int result;
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
1.2 函数参数
两种参数名字可以相同可以不同
实际参数 实参
真实传递给函数的参数叫实参。
实参可以是:常量,变量,表达式,函数等
无论是实参是何种类型的量,在进行函数调用时,都必须有确定的值,以便把这些值都传递给形参。
形式参数 形参
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元)
所以叫形式参数,形式参数只在函数范围内有效,出函数销毁。
形参实例化后是实参的一份临时拷贝。
1.3 函数声明
如果函数定义没在主函数之前,必须要在主函数前声明函数,即是要告诉编译器函数已在别的地方定义过了。
一个函数只能被定义一次,但可以声明很多次。
#include<stdio.h>
exteren void Judge(int x);
int main()
{
int j = 100;
for (j = 100; j <= 200; j++)
Judge(j);
return 0;
}
void Judge(int x)
{
int i;
int flag = 0;
for (i = 2; i < x; i++)
{
if (x % i == 0)
{
printf("%d不是素数\n", x);
flag = 0;
break;
}
else
{
flag = 1;
break;
}
}
if (1 == flag)
{
printf("%d是素数\n", x);
}
}
1.4 返回值
带返回值的函数:
在定义函数时,必须带返回值类型,在函数体里必须有return,若没有返回值,默认返回整型。
注: return后面的语句不会被执行。
无返回值类型函数:
在定义函数时,在函数名前加void
注:在定义函数时,不允许出现函数嵌套,函数定义应该在同一层次。
1.5 调用函数
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
传值调用:
函数的实参和形参分别占有不同的内存块,地址并不相同。
传址调用:
把函数外部创建变量的内存地址传递给函数参数。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
1.6 全局变量和局部变量
局部变量:定义在函数内的变量
局部变量使用前如果没有初始化,会报错。只在函数体内可用,离开函数后,会自动释放。
全局变量:定义在函数外的变量
全局变量在使用前,如果没有初始化,会默认初始化为0。
整个程序可用
定义多个全局变量,会造成内存泄漏,要避免定义多个全局变量
1.7 函数递归
有规律的·:核心:大事化小
#include<stdio.h>
void print(unsigned int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int a = 0;
scanf("%d", &a);
print(a);
return 0;
}
1234 拆分成 123 每一位 + 打印4
123 拆分成12的每一位 + 打印3
12 拆分成1 + 打印2
注!!!
递归的必要条件:
递归一定要写限制条件。否则会栈溢出
每次递归调用之后越来越接近这个限制条件,如果次数过多也会导致栈溢出。
如果递归次数太多,太深,容易出现栈溢出的形式
解决办法:递归改成非递归
静态变量改为static对象,将栈上的静态变量改为存在静态区上的static变量