前言:一些很久很简单的基础,回顾一下,以前没有写博客的习惯,资料都有些乱,现在整理一下基础的东西,放在博客,自己也方便
递归函数:自己调用自己的函数
正确的递归函数:
①递推阶段:不断调用自己
②递推的终止条件
③回归阶段:返回调用的位置
例:
void fun(int n) { printf("hello world\n"); if(n> 0) fun(n-1); } int main(void) { fun(5); return 0; }
变参函数:
格式:返回值类型 函数名(固定参数, ...)
{
函数体
}
例:
void myprint(int n,...) { va_list p; //定义一个提取变参的指针 int i; float a; //对指针初始化 va_start(p,n); for(i = 0; i < n; i++){ a = va_arg(p,double); //提取变参的值 printf("%.2f\t",a); } printf("\n"); va_end(p); //提示变参提取结束 } int main(void) { myprint(3,1.0,2.0,3.0); myprint(5,1.2,2.3,3.4,4.5,5.6); myprint(7,1.0,2.0,3.0,4.0,5.0,6.9,7.9); return 0; }
回调函数:不直接调用,通过其他函数来调用的函数
函数调用过程:
① 地址压栈
② 跳转
③ 执行函数体
④ 返回
函数运行需要一定的时间,使用类函数宏(带参宏)的一个原因可减少执行时间,但带参宏预处理后将不存在了
例:
void fun(int a,void(*p)(int)) { p(a); } int main(void) { fun(123,recall_fun); //隐式(间接)调用回调函数:recall_fun return 0; }
内联函数:将普通函数和带参宏的优点集中在一起的函数
通常函数调用需要一定的时间开销,这意味着执行调用时花费了时间用于调用、传递参数、跳转到函数代码并返回,使用类函数宏的一个原因就是可减少执行时间,一般在头文件中定义
判断一个函数需不需要定义为内联函数的标准:
- 函数体执行时间很短
- 函数体中没有循环语句
- 函数实现的功能对于系统来说比较关键
例:
Inline int max(int i inj) { Return (i>j)? i:j; }