指针保存函数的地址(函数指针)
1、函数指针的概念: 咱们定义的函数,在运行程序的时候,会将函数的指令加载到内存 的代码段。所以函数也有起始地址。
c 语言规定:函数的名字就是函数的首地址,即函数的入口地址 咱们就可以定义一个指针变量,来存放函数的地址。 这个指针变量就是函数指针变量。
2、函数指针的用处: 函数指针用来保存函数的入口地址。 在项目开发中,我们经常需要编写或者调用带函数指针参数的函数。
比如 Linux 系统中创建多线程的函数,它有个参数就是函数指针,接收线程函数的入口地址,即创建线程 成功后,新的任务执行线程函数。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
void *thread_fun1(void *arg) { } void * thread_fun2(void *arg) { } int main() { pthread_t tid1,tid2; pthread_create(&tid1,NULL,thread_fun1,NULL); pthread_create(&tid2,NULL,thread_fun2,NULL); 。。。。 }
3、函数指针变量的定义
返回值类型(*函数指针变量名)(形参列表);
int(*p)(int,int);//定义了一个函数指针变量 p,p 指向的函数 必须有一个整型的返回值,有两个整型参数。 int max(int x,int y) { } int min(int x,int y) { }
可以用这个 p 存放这类函数的地址。
p=max; p=min;
4、调用函数的方法
1.通过函数的名字去调函数(最常用的)
int max(int x,int y) { } int main() { int num; num=max(3,5); }
2.可以通过函数指针变量去调用
int max(int x,int y) { } int main() { int num; int (*p)(int ,int); p=max; num=(*p)(3,5); }
5、函数指针数组
概念:由若干个相同类型的函数指针变量构成的集合,在内存中连续的顺序存储。 函数指针数组是个数组,它的每个元素都是一个函数指针变量。
函数指针数组的定义:
类型名(*数组名[元素个数])(形参列表)
int(*p[5])(int,int); 定义了一个函数指针数组,数组名是 p,有 5 个元素 p[0] ~p[4],每个元素都是函数指针变量, 每个函数指针变量指向的函数,必须有整型的返回值,两个整型参数。
例:
#include<stdio.h> int max(int x, int y) { int temp; if (x > y) temp = x; else temp = y; return temp; } int min(int x, int y) { int temp; if (x < y) temp = x; else temp = y; return temp; } int add(int x, int y) { return x + y; } int { return x - y; } int mux(int x, int y) { return x * y; } int main() { int(*p[5])(int, int) = {mux,min,add,sub,mux}; int num; num = (*p[2])(10,20); printf("num=%d\n", num); return 0; }
6、函数指针应用举例
给函数传参
#include<stdio.h> int add(int x,int y) { return x+y; } int sub(int x,int y) { return x-y; } int mux(int x,int y) { return x*y; } int dive(int x,int y) { return x/y; } int process(int (*p)(int ,int),int a,int b) { int ret; ret = (*p)(a,b); return ret; } int main() { int num; num = process(add,2,3); printf("num =%d\n",num); num = process(sub,2,3); printf("num =%d\n",num); num = process(mux,2,3); printf("num =%d\n",num); num = process(dive,2,3); printf("num =%d\n",num); return 0; }