函数指针(数组)

函数指针

函数指针 - 指向函数的指针
数组指针 - 指向数组的指针

函数指针与数组指针类似

例:

void test()
{
	printf("hehe\n");
}
int main()
{
	printf("%p\n", test);
	printf("%p\n", &test);
	return 0;
}

打印结果为:
在这里插入图片描述

函数名是函数的地址
&函数名也是函数的地址

int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int (*pf)(intint) = &Add;
	return 0;
}

pf 是函数指针变量
int (*)(int, int) 是函数指针的类型
int (*pf)(int,int) = &Add; 与 int (*pf)(int,int) = Add; 表达相同
解引用时
ret = (*pf)(5, 6); 与 ret = pf(5, 6);表示相同

函数指针数组

函数指针数组 - 数组的每个元素时函数指针类型

int (* parr1[10])();
parr1 先和 [ ] 结合,说明 parr1是数组,数组的内容是是 int (*)() 类型的函数指针。

函数指针数组的用途:转移表

例如(计算器):

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;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int, int) = { NULL,add,sub,mul,div };
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);
		if (input <= 4 && input >= 1)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
			printf("ret = %d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出程序\n");
			break;
		}
		else
		{
			printf("选择错误\n");
		}
	} while (input);
	return 0;
}

打印结果为:
在这里插入图片描述

解释:
输入1,进行加法运算
输入2,进行减法运算
输入3,进行乘法运算
输入4,进行除法运算
输入0,退出运算
输入其他,再次输入

int(* p[5])(int, int) = { NULL,add,sub,mul,div }; 是函数指针数组
p 为函数指针数组的变量,与 [5] 先结合为有5个元素的数组,数组中每个元素的类型为int(* )(int, int)
ret = (*p[input])(x, y); 解引用第 input 个元素,传参(x, y)到此元素的函数中,返回值赋值到ret中

指向函数指针数组的指针

指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针
例如:

void test(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	//函数指针pfun
	void (*pfun)(const char*) = test;
	//函数指针的数组pfunArr
	void (*pfunArr[5])(const char* str);
	pfunArr[0] = test;
	//指向函数指针数组pfunArr的指针p
	void (*(*p)[5])(const char*) = &pfunArr;
	return 0;
}

void (* (* p)[5])(const char*) = &pfunArr;
p 与 * 先结合,故 p 为指针,再与 [5] 相结合,故 p 为数组指针,数组的每个元素都是void (* )(const char*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值