一、为什么要用函数
①避免代码冗长:如果代码程序的功能比较多、规模比较大,把所有的代码放在主函数main中,会使主函数变得庞杂,头绪不清,使阅读和维护程序变得困难,此外,有时程序需要多次实现某一功能,就需要多次实现某一功能,就需要多次重复编写实现此功能的程序代码。
②模块化设计思路:人们自然会想到组装的办法简化程序设计的过程,如同组装电脑,先生产好各种部件,最后组装时需要什么就从仓库拿什么,直接装上就可以了。
③按功能划分:每个函数代表一个功能,而函数的名字要体现函数的功能含义,如sin函数实现求一个数的正弦函数,把它存放在函数库中,需要调用时,直接在程序上写sin就可以调用系统函数库中的函数代码,执行这些代码,就可以得到预期结果。
二、函数的三要素
同变量一个道理,函数要先定义,再使用。
函数体:执行什么样的功能,所涉及的处理代码。
①函数名:函数的命名要能够体现函数的功能。
②参数列表:例如y=f(x),x就是参数,参数的个数根据需求自行定义。
③返回值:在y=f(x),y是函数根据x值和功能执行后的结果。
三、函数的封装
①定义无参数函数:
void表示没有返回值,括号()内无参数。
#include <stdio.h>
void printWelcome()
{
printf("hello,world\n");
}
int main(){
printWelcome();
}
②定义有参数有返回值的函数:
如y=f(x)一个参数一个返回值。
第一个int表示返回值的类型,括号里面是形式参数,形式参数需要包含变量类型和变量名,int-变量类型,data-变量名。
int getData(int data)
{
return data-1;
}
int main(){
int x;
int y;
puts("请输入一个数:");
scanf("%d",&x);
y = getData(x);
printf("x=%d,y=%d\n",x,y);
return 0;
}
③定义空函数:
程序设计,模块设计的时候占坑用。
void initWifi()
{}
四、函数的调用
1.函数名+(传递参数);
注意问题:①函数调用时不能带类型:如y=int f(x)是错误的,函数在封装时就已经声明了变量类型。②函数调用时形式参数不带类型,如y=add(int a,int b)。
见怪不怪:①函数当做表达式,用的是它的返回值。如printf("%d+%d=%d\n",x,y,add(x,y))②函数调用当做其他函数的参数,用的也是它的返回值。如z=add(x,y)+100
2.调用库函数
如果使用函数库,应该在文件开头用#include指令将调用有关库函数时所需要用的信息包含到本文件中,如 #include <stdio.h>是一个头文件,"stdio.h"包含输入输出库函数的声明,如果不包含"stdio.h"文件中的信息,就无法使用输入输出库中的函数。
3.函数的声明
如果自己定义的函数在调用的函数(主函数main)后面,应该在主函数中对被调用的函数作声明,声明的作用是将函数名,函数参数个数和参数类型等信息通知编译系统,以便在调用时能正确识别,并检查调用是否合理。
#include <stdio.h>
int getData(int a);//声明函数(函数原型+分号)
int main(){
int a;
int x;
puts("请输入一个数:");
scanf("%d",&a); //获取数值
x= getData(a);
printf("实际参数a的内存地址是:%p,值为%d\n",&a,a);//打印实际参数地址
return 0;
}
int getData(int a) //创建函数getData获取数值功能
{
printf("形式参数a的内存地址是:%p,值为%d\n",&a,a);//打印形式参数地址
return 0;
}