函数
函数:
对函数的定义:子程序(子程序是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性)
C语言中函数的分类:1.库函数 2.自定义函数
库函数:
C语言常用的库函数:IO函数 字符串操作函数 字符操作函数 内存操作函数 时间/日期函数 数学函数 其他库函数
注:使用库函数,必须包含 #include 对应的头文件。
库函数查询工具:
MSDN(Microsoft Developer Network)
www.cplusplus.comhttp://en.cppreference.com
自定义函数:
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
int Max(int a, int b)
{
return a> b?a:b;
}
int main()
{
int x=10;
int y=20;
Max(x,y);
return 0;
}
参数: 1.个数匹配 2.参数的类型
返回值:
如果有返回值,必须返回一个值,否则会有警告
返回值的类型也需要匹配
如果没有返回值void(无返回值类型)
函数名:C语言中:建议:函数名遵循驼峰式命名FirstName
函数的参数:
实际参数(实参):
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
int a=10;//实参
int b=20;
void Swap1(int x, int y)//形参
void Swap2(&a,&b)//按址传递
形参的改变不会影响实参的改变(按值传递)
形参实例化之后其实相当于实参的一份临时拷贝。
函数的调用
传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用:把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
函数的嵌套调用和链式访问
函数和函数之间可以有机的组合的。
嵌套函数
链式访问:把一个函数的返回值作为另外一个函数的参数。
strcpy的返回值类型 char*(原因:为了实现链式表达式)strcat(arr,bit)
函数的声明和定义
函数声明:一般出现在函数的使用之前,放在头文件中。要满足先声明后使用。
函数定义:指函数的具体实现,交代函数的功能实现。
tese.h的内容:放置函数的声明
tese.c的内容:放置函数的实现
函数递归
递归:程序调用自身的编程技巧成为递归。
递归是一种算法
递归的主要思考方式在于:把大事化小
int Fac(int n)
{
if(n==1)
{
return 1;
}
else
{
return n*Fac(n-1)
}
}
递归满足两个条件:
1.调用自己本身 2.有一个趋近于终止的条件
技巧:
思考问题:横向思考
代码执行:纵向执行
所有的函数的执行,都是发生在栈上 (栈的特性:先进后出)
如果没有终止条件,则运行会出现:函数将导致运行时堆栈溢出
递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。
递归与迭代
提示:
- 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
- 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
- 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。