C语言 函数指针

函数指针

//数组指针
int arr[10];
int(*p)[10] = &arr;
//函数指针
int Add(int x, int y);
int(*pf)(int, int) = &Add;
//int(*pf)(int, int) = Add;//该代码与上面的代码意义相同,即函数名就可以代表函数的地址

代码示例

( *( void (*)() ) 0 )();

0先与 (void(* )()) 结合,也就是说0先被强制类型转换为 void(* )() 的函数指针,然后又被解引用(* (void(* )())0) 就相当于使用在0地址处的类型为void(*)()的一个函数,而后面的那个括号本来就没有参数。

void (*signal(int, void(*)(int)))(int);

signal是变量名,signal先与后面的括号结合,表明signal是一个函数,括号内的内容表明该函数第一个参数的参数类型是int,第二个参数的参数类型是void(* )(int),该代码去掉signal(int, void(* )(int)),剩下的内容是void(*)(int),这部分内容是signal函数的返回类型。

//typedef unusigned int u_int
typedef void(*pf)(int);
pf signal(int, pf);

使用typedef将void(*)(int) 重定义为pf, 然后再用pf表示signal函数更加容易理解(注意重命名时的书写)

函数指针数组

存放函数指针的数组就是函数指针数组

//指针
int* p = NULL;
//指针数组
int* arr[5];
//函数指针
int(*pf)(int, int);
//函数指针数组
int(*pf[5])(int, int); 

int(* pf[5])(int, int)中pf先与[]结合表明pf是一个数组,去掉pf[5]后的内容是该数组中的元素类型int(* )(int, int),也就是说该数组中存放的有5个类型为int(* )(int, int)的函数指针。

示例:计算器

#include <stdio.h>
void menu();
int Add(int, int);
int Sub(int, int);
int Mul(int, int);
int Div(int, int);

int main()
{
	int x = 0;
	int y = 0;
	int ret = 0;
	int input = 0;
	int(*pf[5])(int, int) = {NULL, Add, Sub, Mul, Div};
	do
	{
		menu();
		scanf("%d", &input);
		if (input <= 4 && input >= 1)
		{
			printf("Enter two numbers: ");
			scanf("%d%d", &x, &y);

			ret = pf[input](x, y);
			printf("%d\n", ret);
		}
		else if (0 == input)
		{
			printf("退出程序\n");
		}
		else
		{
			printf("输入错误\n");
		}
		
	} while (input);
	return 0;
}
int Add(int a, int b)
{
	return a + b;
}
int Sub(int a, int b)
{
	return a - b;
}
int Mul(int a, int b)
{
	return a * b;
}
int Div(int a, int b)
{
	return a / b;
}
void menu()
{
	printf("\n1.add  2.sub\n");
	printf("\n3.mul  4.div\n");
	printf("\n   0.exit\n");
}

该程序中的函数指针数组将调用的函数都存放到一个数组中,在使用的时候可以直接使用不同的下标来访问不同的函数。

指向函数指针数组的指针

指向函数指针数组的指针是一个指针,它指向了一个数组,该数组是函数指针数组。

//函数指针
int(*p)(int, int);
//函数指针数组
int(*pf[5])(int, int);
//指向函数指针数组的指针
int(*(*pff)[5])(int, int);

pff 先与 * 结合,表明 pff 是一个指针,去掉 ( * pff ) 之后,剩下的就是 pff 指向的类型,也就是 int( * [5])(int, int)。因为 pff 可以理解为对函数指针数组取地址,也就是 pff = &pf, * pff也就应该等价于 pf ,所以可以直接在函数指针数组 pf 的基础上得到指向函数指针数组的指针,也就是将 pf 直接改为 * pff ,再在 * pff 的外面加上括号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值