C语言之函数指针

155 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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) ){}
  • 函数指针变量常见的用途之一是把指针作为参数传递到其他函数,指向函数的指针也可以作为参数,以实现函数地址的传递。

注意函数指针与指针函数的区别:

  1. 函数指针是指向函数的指针;

  2. 指针函数是返回类型为指针的函数。

写在文末

这是本人在学习C语言过程中的点滴记录,希望分享出来能与大家一起进步,如有表达不足或者有错误的地方,恳请大家积极批评指正!!