函数指针和指针函数用法

1、指针函数是函数,函数的返回类型是指针类型。
类型标识符 *函数名(参数列表)
int *f(int,int);
他是一个函数,是一个带返回值地址的。函数的返回值必须是相同类型的指针变量来接收,也就是,指针函数必须是有函数返回值的,而且,函数返回值必须赋值同类型的指针变量。

int* GetDate(int wk, int dy);
int main()
{
	int i = 0, j = 0;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d\t", *GetDate(i, j));
		}
		printf("\n");
	}

	return 0;
}

int* GetDate(int wk, int dy)
{
	int arr[5][7] = {
		{1,2,3,4,5},
		{6,7,8,9,10},
		{11,12,13,14,15},
		{16,17,18,19,20},
		{21,22,23,24,25}
	};
	return &arr[wk][dy];
}

运行结果:
在这里插入图片描述

 函数指针和指针函数的不同,主要区别就是函数名前面的指针*号是没有()起来的,如果()起来的就是函数指针,否则就是指针函数。

函数指针
就是指向函数的指针
函数指针是指向函数的指针变量。每一个函数都要一个入口地址,就和数组名一样指向数组的首地址(第一个元素),函数名也就是指向函数的首地址。
在定义一个函数指针的时候需要按照下面格式:
变量类型名(*函数名)(参数列表)


int (*p)(int a, int b);//函数指针

int Add(int a, int b)//加法函数
{
	return a + b;
}
int main()
{
	int a=10,b=20,c;
	p = Add;//函数指针赋值
	c = p(a,b);
}
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 main()
{
	int a = 12, b = 4;
	int(*p)(int, int);
	p = add;
	printf("p(a,b)=%d\n", p(a, b));
	p = sub;
	printf("p(a,b)=%d\n", p(a, b));
	p = mul;
	printf("p(a,b)=%d\n", p(a, b));
	return 0;
}

运行结果:
在这里插入图片描述

函数指针数组

int max(int x, int y)
{

	return x > y ? x : y;
}
int min(int x, int y)
{
	return x < y ? x : y;
}
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 main()
{
	int(*p[5])(int, int) = { max,min,add,sub,mux };
	int num;
	num = (*p[3])(10, 20);
	printf("%d\n", num);
	return 0;
}

4.回调函数
回调函数就是一个通过函数指针调用1函数,如果把函数的地址作为参数传递给另一个函数,当这个函数指针被用来调用其所指向的函数时,我们称这个时回调函数。

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;
}
//定义回调函数
void  math(int(*fun)(int x, int y), int s, int t)
{
	printf("fun(int,int)=%d\n", fun(s, t));
}
int main()
{
	int a = 22, b = 3;
	math(add, a, b);
	math(sub, a, b);
	math(mul, a, b);
	return 0;
}

运行结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值