函数指针的巧妙应用

对于一个函数而言,函数名是指向函数第一条指令的常量指针。而编译器要做的就是在程序编译之后,为每个函数分配一个首地址,即该函数第一条指令的地址。

一般情况下,我们可以用一个指针来保存这个地址,而这个指针就是函数指针,该指针可以看作是它指向函数的别名,所以我们可以用该指针来调用这个函数。


下面通过一个例子,来体会函数指针的妙用。

对于C语言,由于没有C++中的函数重载,模板等代码可以复用的方便操作,不太容易实现一个通用的函数来完成较多参数类型不同的类似功能。

但是,可以利用函数指针来巧妙的实现。


声明:

#include <stdio.h>
#include <assert.h>
#include <string.h>

//定义一个函数指针类型pFun。
typedef int (*pFun)(void *ele1, void *ele2);
//比较int类型大小的函数
int int_cmp(void *ele1, void *ele2);
//比较char类型大小的函数
int char_cmp(void *ele1, void *ele2);
//查找dest指向的内容中有没有key,n表示查找几次,width是一次查多少个字节
void *search(void *dest, void *key, int n, int width, int (*cmp)(void *ele1, void *ele2));

函数实现,注:通过传入的不同函数指针,使得可以指向不同的回调函数,实现用一段代码,可以执行不同类型的功能。

//查找dest指向的内容中有没有key,n表示查找几次,width是一次查多少个字节
void *search(void *dest, void *key, int n, int width, int (*cmp)(void *ele1, void *ele2))
{
	int i = 0;

	assert(NULL != key);
	assert(NULL != dest);
	
	for (; i < n; ++i)
	{
		void *address = (char *)dest + i*width;
		
		if (cmp(key, address) == 0)
			return address;
	}

	return NULL;
}

比价int类型大小的函数

//比较int类型大小的函数
int int_cmp(void *ele1, void *ele2)
{
	assert(NULL != ele1);
	assert(NULL != ele2);

	if (*(int *)ele1 > *(int *)ele2)
		return 1;
	else if (*(int *)ele1 < *(int *)ele2)
		return -1;

	return 0;
}
比较char类型大小的函数
//比较char类型大小的函数
int char_cmp(void *ele1, void *ele2)
{
	assert(NULL != ele1);
	assert(NULL != ele2);

	if (*(char *)ele1 > *(char *)ele2)
		return 1;
	else if (*(char *)ele1 < *(char *)ele2)
		return -1;

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值