函数可以把大的计算任务分解成若干个较小的任务。一个设计得当的函数可以把程序中不需要立即的具体操作细节隐藏起来,从而使整个程序结构更加清晰,并降低修改程序的难度。
函数结构
函数的结构如下:
返回类型 函数名称(参数类型 参数名称)
{
函数体
返回 结果;
}
函数就是一个代码块,可以再任何地方调用。
函数的使用步骤:
1>声明 函数再使用前,告诉计算机有这么一个函数。
2>定义 实现函数是怎么做的,程序如何执行。
3>调用 真正的执行这个函数。
注意:声明函数,就是函数的定义去掉函数体部分。如果需要声明一个函数没有参数,需要使用void关键字。如 int func(void);如果声明一个函数没有写参数,不代表没有参数,而是可以有任意个数的参数。
函数的参数
执行一段代码时,需要参考条件,根据不同的条件执行不同的代码。
定义函数的时候,参数为形参。
调用函数的时候,参数为实参。
函数中的多个参数:
void func(int arg1, char arg2, float arg3)...
函数的返回值类型
当执行一段代码,需要结果的时候,就需要定义返回值类型。
返回值类型就是标识,这段代码执行后得到的结果类型。
通常要与return关键字结合使用,return值,值为函数的执行结果。
如果一个函数有返回值类型,就必须有返回值。
如果一个函数有返回值类型,当调用函数的时候,需要声明一个变量来接受一个返回值。
返回值类型实void,证明函数没有返回值。
最后用个举例程序说明下
#include <stdio.h>
// 声明一个函数
void sayHello(void);
// 实现函数
void sayHello(void)
{
printf("Hello World by func\n");
}
int main(int argc, const char * argv[])
{
// insert code here...
printf("Hello, World!\n");
// 调用函数
sayHello();
return 0;
}
递归函数
一个函数,自己调用自己,如果没有控制好临界值的话,就会变为死循环。
实用递归必须注意两个方面:
1>必须要有结束条件
2>每次递归后,应该使算法越来越简化。
我们用递归求了阶乘10!的结果。
#include <stdio.h>
// 声明函数
int func(int i);
// 定义函数
int func(int i)
{
int result;
if (i==1) {
// 递归出口
result = i;
}else{
// 递归,自己调用自己
result = i*func(i-1);
}
return result;
}
int main(int argc, const char * argv[])
{
// 调用函数
printf("%d\n",func(10));
return 0;
}
变量的作用域与生命周期
1>变量的作用域:变量的适用范围。
变量的作用域与{}有关
下一级的代码块可以访问上一级的变量
上一级的代码块使不可以访问下一级的变量
取值时遵守就近原则
变量的作用域主要分为两大部分:
局部变量:再函数内部声明的变量叫做局部变量。
局部变量只能再函数肚饿内部使用。
全局变量:在函数外部声明的变量叫全局变量。
全局变量可以再当前文件汇总,所有函数中使用。
2>变量的生命周期:
变量的生:当创建变量时,会开辟一个内存空间,此时就是变量的生。
变量的死:当变量不在使用的时候,系统将内存空间回收,此时就是变量的死。
局部变量的生命周期:
(1) 自动变量:使用auto修饰或默认情况声明的变量,就是自动变量,自动变量的生命周期从{开大,到}结束。
(2) 静态变量:使用static关键字修饰,从程序执行开始,到程序结束销毁,与程序共生死。
全局变量:从程序执行开始,到程序结束销毁,与程序共生死,全局变量没有自动变量与静态变量区分。
作用域 生命周期
局部变量 函数内部 函数内部(自动)/程序(静态)
全局变量 文件中 程序