函数是一段具有某种功能的代码集合,是c语言中管理代码的最小单位。把代码分成一个个函数,可以方便地管理和调用代码。
1、函数分类
标准库函数:C语言标准委员会为c语言以函数形式提供的一套基础功能,这些功能被封装在libc.so库中。
使用时需要包含头文件,调用时采用函数名(参数)方式。
系统函数:是操作系统以函数接口形式提供的一套功能:内存管理、信号处理、文件IO、文件管理、进程管理、进程通信、线程通信、线程同步、网络通信
第三方库函数:由第三方提供的,一些开源或者收费的代码
自定义函数:为了更好地管理代码,减少冗余把代码封装成函数
注意:一个函数尽量控制在50行以内,要求一个函数一个功能
2、函数声明
函数声明:告诉编译器函数的格式,方便编译器检查调用函数是否正确
函数格式: 返回值类型 函数名(参数类型 形参名,参数类型 形参名,…);
注意:函数声明分号结尾
例如:
int sum(int a,int b);
建议:
1、C语言中函数名全部小写,可以用下划线分隔
2、如果不需要参数时,建议写void,返回值类型 函数名(void));
3、如果不需要返回值时,也建议写void,但是return后面不能跟数据 void 函数名(参数类型 形参名,参数类型 形参名,…));
隐式声明:当调用函数之前没有声明和定义,编译器会猜测函数的格式,参数列表会根据调用时提供的实参(数据)来猜测,返回值猜测为int类型。
注意:函数定义如果在函数调用之前,可以忽略函数声明。如果函数调用前未声明,并且函数在调用后定义。此时,编译器会对函数进行隐式说明,如果函数格式与隐式声明不一致,编辑器会报错。
3、 函数定义
定义格式:
返回值类型 函数名(参数类型 形参名,参数类型 形参名,…)
{
函数体
return 返回值;
}
例如:
int sum(int a,int b)
{
return a+b;
}
4、函数调用
函数名(实参1,实参2,…);
注意:调用函数会返回返回值,可以立即打印显示,或者赋值给变量,如果都不处理,返回的函数返回值将失效。
例如:
#include<stdio.h>
int sum(int a,int b)
{
return a+b;
}
int main()
{
int a=1,b=2;
printf("%d ",sum(a,b));
}
5、函数传参
值传递:普通变量的传参都是值传递,实参的值赋值给形参的值。两者相互独立,互不干扰。
例如:
#include<stdio.h>
int sum(int a,int b)
{
return a+b;
}
int main()
{
int a=1,b=2;
printf("%d ",sum(a,b));
}
注意:在函数内改变形参的值并不会影响实参的值,并且在函数外不能调用到形参的值。
址传递:数组变量的传参都是址传递,将实参的地址赋值给形参的地址,两者共用同一个地址。当数组变量作为函数的参数时,数组长度会丢失,所以需要额外增加一个变量len把数组的长度也传递过去。
例如
#include<stdio.h>
int sum(int a[])
{
return a[0]+a[1];
}
int main()
{
int a[2]={1,2};
printf("%d ",sum(a));
}
注意:由于址传递中形参和实参使用的是同一个地址,修改形参的值的同时,实参的值也会改变。可以简单地认为它们两个共享同一个变量。
返回值传递:return 其实是把返回值数据放到一个公共区域(函数和函数调用者能共同访问的区域)。
注意:如果不写return,该区域就是一个随机的垃圾数据。
6、函数的设计准则:
- 一个函数最好只解决一个问题,这样可以降低出错率、提高可读性
- 尽量不要依赖其他函数(降低耦合度)
- 数据由调用者提供,结果返回给调用者(通用性)
- 尽量考虑调用者提供的非法数据,可以通过提示信息、返回值告诉调用者错误原因、或者在注释中把可能出现的情况说明(健壮性)
- 最好一个函数不超过50行代码
结语
希望这篇文章对你有所帮助