开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情。
一、函数指针
1、函数类型
-
一个函数在编译时被分配一个入口地址,一个地址就称为函数的指针,
函数名代表函数的入口地址。 -
函数三要素:名称、参数、返回值。C语言中的函数有自己特定的类型。
-
C语言中通过
typedef为函数类型重命名:
typedef int f(int,int); //f为函数类型
typedef void p(int); //P为函数类型
这一点和数组一样,因此可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。
注意通过函数类型定义的变量是不能够直接执行,因为没有函数体。只能通过类型定义一个函数指针指向某一个具体函数,才能调用。
示例程序
typedef int(p)(int, int);
void my_func(int a,int b){
printf("%d %d\n",a,b);
}
void test(){
p p1;
//p1(10,20); //错误,不能直接调用,只描述了函数类型,但是并没有定义函数体,没有函数体无法调用
p* p2 = my_func;
p2(10,20); //正确,指向有函数体的函数入口地址
}
2、函数指针
-
函数指针定义方式(先定义函数类型,根据类型定义指针变量);
-
先定义函数指针类型,根据类型定义指针变量;
-
直接定义函数指针变量;
3、函数指针数组
函数指针数组,每个元素都是函数指针。
示例程序如下:
void func01(int a){
printf("func01:%d\n",a);
}
void func02(int a){
printf("func02:%d\n", a);
}
void func03(int a){
printf("func03:%d\n", a);
}
void test(){
#if 0
//定义函数指针
void(*func_array[])(int) = { func01, func02, func03 };
#else
void(*func_array[3])(int);
func_array[0] = func01;
func_array[1] = func02;
func_array[2] = func03;
#endif
for (int i = 0; i < 3; i ++){
func_array[i](10 + i);
(*func_array[i])(10 + i);
}
}
4、函数指针做函数参数(回调函数)
- 函数参数除了是普通变量,还可以是函数指针变量。
//形参为普通变量
void fun( int x ){}
//形参为函数指针变量
void fun( int(*p)(int a) ){}
- 函数指针变量常见的用途之一是把指针作为参数传递到其他函数,指向函数的指针也可以作为参数,以实现函数地址的传递。
注意函数指针与指针函数的区别:
-
函数指针是指向函数的指针;
-
指针函数是返回类型为指针的函数。
写在文末
这是本人在学习C语言过程中的点滴记录,希望分享出来能与大家一起进步,如有表达不足或者有错误的地方,恳请大家积极批评指正!!