------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、函数定义
定义函数包括以下几个内容:
1)指定函数的名字,以便以后按名调用。
2)指定函数的类型,即函数返回值的类型。
3)指定函数参数的名字和类型,以便在调用时像他们传递数据。(无参函数不需要)
4)指定函数应当完成什么操作。
使用一般格式:
无参类型
返回类型名 函数名(){
函数体;
}
有参类型
返回类型名 函数名(参数类型1 参数名1,参数类型2 参数名2){
函数体;
}
* 有参数函数定义时可以省略参数名,但必须写参数类型。
如果函数定义在main函数之后,需在main函数前进行声明。
声明方法:删除函数的大括号和函数体并在最后加“;”
二、函数调用
在定义和声明函数后便可以通过函数名调用函数。(有参数的函数要输入对应的参数)
例:
#include <stdio.h>
void sc(int x,int y);
int main(int argc, const char * argv[]) {
sc(10, 2);//调用函数
return 0;
}
void sc(int x,int y){
printf("%d",x+y);
}
在定义函数时函数名后面括号中的变量名称为“形式参数”(形参)。在主调函数中调用函数,函数名后面括号中的参数称为“实际参数”(实参)。
定义函数指定的形参,在未出现函数调用时,他们并不占用内存中的存储单元,在发生函数调用时,函数的形参被临时分配内存空间
函数的返回值:
希望通过函数调用使主函数得到一个确定的值,这就是函数返回值。
1)函数返回值是通过函数中的return语句获得的。
2)函数返回值与定义函数时设置的返回值类型一般属于同一类型。如果不一致,以函数类型为准。
三、函数嵌套调用
例:
#include <stdio.h>
int max4(int a,int b,int c,int d);
int max2(int a,int b);
int main(int argc, const char * argv[]) {
printf("max = %d\n",max4(4, 2, 3, 1)); //输入4个数比大小
return 0;
}
int max4(int a,int b,int c,int d){ //嵌套函数返回最大值
int m;
m = max2(a,b);
m = max2(m,c);
m = max2(m,d);
return m;
}
int max2(int a,int b){ //2个数比较大小的函数
if (a>=b) {
return a;
}else{
return b;
}
}
四、函数递归调用
在调用一个函数过程中直接或间接的调用该函数本身为函数的递归调用。
例:求10!的递归调用方法
#include <stdio.h>
int fac(int n);
int main(int argc, const char * argv[]) {
int a = 10;
int b = fac(a);
printf("%d != %d\n",a,b);
return 0;
}
int fac(int n){
int f;
if (n<0) {
printf("数据错误!\n");
}else if (n == 0||n == 1){
f = 1;
}else{
f = fac(n-1)*n;
}
return f;
}
*递归调用非常耗内存,尽量老用。
五、局部变量和全局变量
局部变量:在一个函数内部低你故意的变量只在本函数范围内有效,也就是说只有在本函数内才能引用,在此函数以外是不能使用这些变量。
如:
void test{
int a = 1;
printf("%d",a);
}
变量a为局部变量,它只能在这个test函数中使用。
全局变量:在函数外部定义的变量,可以在本程序其他函数中公用。
如:
int a = 1;
void test1{
printf("%d",a);
}
void test2{
printf("%d",a);
}