目录
一、库函数
二、自定义函数
三、函数的参数
四 、函数的调用
1 、传值调用
2 、传址调用
五、函数的嵌套调用和链式访问
六、函数的声明和定义
1 函数声明:
2 函数定义:
七、函数的递归与迭代
八、总结
一、库函数
库函数查询网站:www.cplusplus.com 。
注:但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。这里对照文档来学习上面几个库函数,目的是掌握库函数的使用方法。
二、自定义函数
格式:
ret_type fun_name(para1, * )
{
statement;//语句项
}
//ret_type 返回类型
//fun_name 函数名
//para1 函数参数
注:1、如果不返回值时,使用void。
2、如果不写返回类型,则默认返回int类型。
代码示例:
#include <stdio.h>
//实现成函数,但是不能完成任务
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
//正确的版本
void Swap2(int *px, int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);
printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
Swap2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
return 0;
}
请对比上面2串代码,我们可以发现二个函数,传入的参数不相同。
三、函数的参数
2、形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
我们可以对比上面二个函数:
形参实例化之后其实相当于实参的一份临时拷贝。
四 、函数的调用
1 、传值调用
2 、传址调用
同样我们用上面的两串代码来进行对比:
五、函数的嵌套调用和链式访问
函数可以根据实际情况进行嵌套调用和链式访问。
嵌套调用:函数可以嵌套调用,但是不能嵌套定义。
链式访问:把一个函数的返回值作为另外一个函数的参数。
示例:
#include <stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
六、函数的声明和定义
1 函数声明:
- 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
- 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
- 函数的声明一般要放在头文件中的。
2 函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。
test.h 的内容放置函数的声明#ifndef __TEST_H__ #define __TEST_H__ //函数的声明 int Add(int x, int y); #endif //__TEST_H__
test.c 的内容放置函数的实现#include "test.h" //函数Add的实现 int Add(int x, int y) { return x+y; }
七、函数的递归与迭代
实现求n的阶乘。(不考虑溢出)
参考代码
int factorial(int n)
{
if(n <= 1)
return 1;
else
return n * factorial(n-1);
}
上面这个函数就使用了递归的思想,但是如果n的值如果很大的话,将会发生程序崩溃等问题。
因此,我们引入了一个概念:
系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。所以为了避免 栈溢出,推荐使用迭代。注:解决上述的问题:1. 将递归改写成非递归。2. 使用 static 对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代nonstatic 局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。
示例:
int factorial(int n)
{
int result = 1;
while (n > 1)
{
result *= n ;
n -= 1;
}
return result;
}
八、总结
合理的使用函数,可以大大的节约我们的空间,以及降低代码出现的次数、复杂度等。