一、函数
函数:实现特定功能的代码块
优点:程序更简洁,加快运行速度,减少代码重复性
库函数
IO函数:scanf/printf/getchar/putchar/gets/puts
str函数:strlen/strcpy/strcat/strcmp
lib函数:atoi
数学函数:pow/sqrt
主函数:main,一个程序只能有一个main函数,任意函数可以调用main函数
1.1 函数定义格式
格式:
存储类型 数据类型 函数名(参数列表) //函数头
{
函数体;
}
1.存储类型:函数省略存储类型默认是extern
auto\staticl\extern\lregister
2.数据类型:基类型,构造类型,空类型void,指针类型
3.函数名:满足命名规范
变量:小写 常量:大写 函数:下换线\驼峰命名
4.():函数标志,不允许省略 {}:不允许省略
5.参数列表:可有可无,当存在多个时,需要使用逗号隔开
1.2 函数的分类
1.库函数:系统自带的函数
2.自定义函数::由程序员手动封装的函数
2.1有无参函数
有无参:参数列表决定,如果参数列表存在,则称为有参函数,否则称为无参函数
2.2有无返函数
有无返:数据类型决定,如果数据类型是void,则称为无返函数,否则称为有返函数
void sum(void) 无参无返函数
void sum(int a) 有参无返函数
int Sum(void) 无参又返函数
int Sum(int a) 有参有返函数
1.3 无参无返函数
定义格式:
存储类型void函数名(void)
{
函数体;
}
调用格式::
函数名();
1、自定义函数在main上面
2、自定义函数在main下面
注意:自定义函数在主函数下面定义时,需要声明函数
1.4全局和局部变量
1.全局变量
全局变量:定义在函数外的变量
内存:全局变量在静态区
作用域:从定义开始,到本文件结束
2.局部变量
局部变量:定义在函数内的变量,参数列表\
内存:在栈区
作用域:从定义开始,到本函数有效
3.全局和局部变量重名
1.全局变量和局部变量重名时,优先选用局部--->就近原则
2.局部和局部变量命名----》就近原则
1.5有参函数
为什么有参函数?
被调用函数需要使用主调函数的局部变量,解决方式传参
定义格式:
存储类型 数据类型 函数名(参数列表)
{
函数体;
}
调用格式:
函数名(变量名1,变量名2);
char a[5]="2",b[5]="1";
strcmp(a,b);
实参和形参的类型
实参:变量,常量,表达式
形参:变量
规则:
1、个数一致
2、一一对应
3、类型建议一致:如果不一致以形参为主,发生强制转换
4、变量名可以不一致
5、实参只写变量名,形参需要写数据类型
数组做参数:只传递数组变量名,表示把整个数组传递过去
有参无返函数中 “int arr“为一个指针,指针类型在64位操作系统为8字节
练习2:在主函数定义一维数组初始化11 22 33 44 55
在自定义函数中实现输出数组元素
1.6有返函数
为什么有返?主调函数需要使用被调函数的局部变量,解决方式返回
定义格式:
存储类型数据类型函数名(参数列表)
{
函数体;
return 表达式;
}
调用格式:谁调用函数就返回给谁
1.变量=函数名(变量名1,变量名2...);
2.直接使用 函数名(变量名1,变量名2...);
char str[]="hello";
printf("%ld\n",strlen(str));
int len=strlen(str);
1.数据类型:如果数据类型时void,则默认是无返函数,不是void则称为又返函数
2.数据类型:可以省略不写,默认返回的数据类型时int
3.return:返口结宋出数
格式1:return 表达式
格式2:return(表达式)
表达式:可以是变量,常量,表达式
4.一个函数可以无数个return,但是只有第一个其效果
5.一个return只能返回一个值
6.数据类型建议和return的值的类型保持一致,如果不一致以数据类型为主,发生类型转换
1.7 递归
递归:函数的自身调用,把大问题分解为多个独立的子问题解决的方式,递归的本质是循环
直接递归:一个函数的自身调用
间接递归:多个函数之间相互递归调用循环执行速度快于递归,递归解决问题规模较大的情况,循环解决问题规模较小的情况
递归组成:递归边界、递归前进段