七. 指针函数、函数指针、函数类型
1. 指针函数
概念:返回值类型为指针的函数,本质是函数
模型:int *a(int i, int j);
2.函数指针
概念:本质是指针,存储函数的地址; 函数名就是函数的地址。
int add(int p, int q); //函数的类型为:int ()(int p, int q) == int ()( int, int) //&add或add 都是可以表示函数的地址,类型为:int (*)( int, int) 定义函数指针存储函数地址: int (*p)( int, int) = add; //p==add 直接调用函数:int num = add(10, 20); 通过函数指针调用函数: int num = p(10, 20); 示例代码: #include <stdio.h> #include <strings.h> int add(int a, int b); int main(int argc, const char*argv[]) { int (*p)( int, int) = add; //通过函数指针调用函数: int num = p(10, 200); printf("num:%d\n", num); return 0; } int add(int a, int b) { return a+b; }
3.函数分类
①. 变参函数:函数调用时,实参个数是可以改变的,一般在系统里面使用
例如:printf函数,scanf函数;
②. 回调函数:母函数和子函数,子函数由使用者去实现,母函数代码一般是不可见的 ,只提供函数接口。
#include <stdio.h> #include <strings.h> int func(int (*p)(int, int), int num1, int num2);//用来调用子函数 //子函数 int add(int a, int b); //子函数 int reduce(int a, int b); int main(int argc, const char*argv[]) { int num = func(add, 100, 200); printf("num:%d\n", num); num = func(reduce, 100, 200); printf("num:%d\n", num); return 0; } //子函数 int add(int a, int b) { return a+b; } //子函数 int reduce(int a, int b) { return a-b; } //母函数 --> 实现两个数的运算,运算规则可以你自己实现 /* 函数功能:实现两个数的运算,例如:加法、减法... 形参作用: p --》函数指针,你要运算的规则,可以写在这个函数里面 num1、num2要运算的两个数 返回值:返回运算结果 */ int func(int (*p)(int, int), int num1, int num2) { //通过函数指针调用函数 int num = p(num1, num2); return num; }
③. 内联函数:在某些情况下,有些函数会被调用非常频繁,函数代码非常精简,为了节省这个现场保护和现场恢复的时间, 就可以把函数声明为内联函数,在编译阶段,他会把函数的代码编译到被调用的函数里面,调用该函数时,就不需要跳转; 但是内联函数声明后,不一定会实现,具体要看编译器的判断。
示例代码: #include <stdio.h> #include <strings.h> inline int add(int a, int b); int main(int argc, const char*argv[]) { int num = add(100, 200); printf("num:%d\n", num); return 0; } inline int add(int a, int b) { return a+b; }
④. 递归函数:自己调用自己
使用递归函数必须要有结束条件,否则他会一直运算下去直到内存爆了为止。
示例代码: 计算某个数的阶乘 #include <stdio.h> #include <strings.h> int func(int num); int main(int argc, const char*argv[]) { int num; scanf("%d", &num); int sum = func(num); printf("sum:%d\n", sum); return 0; } int func(int num) { if(num == 1 || num == 0) return 1; int sum = num*func(num-1); return sum; }