C语言函数指针使用的一个例子(Win10,VS2022)

在阅读一些开源系统的源代码时,经常见到大量函数指针的使用,为了学习和理解函数指针,假想了一种情况,并使用函数指针达到目的。

假想两个结构体StructA和StructB都含有相同类型的字段t,而其他字段可能不同,为了使用统一的形式(或者说同一个函数)获取两种不同类型数据的t值,可以使用函数指针。

在Win10中使用VS2022编程实验。

在VS2022中新建C++空项目,添加源文件“main.cpp”,输入如下代码:

typedef struct StructA{
	__int64 t;
	char a;
}StructA;
typedef struct StructB{
	int b;
	__int64 t;
}StructB;

#define DATA_SIZE (5)
StructA sa[DATA_SIZE];
StructB sb[DATA_SIZE];

enum DataType {
	DataType_StructA,
	DataType_StructB
};

//	获取t值的函数.
__int64 getT(void* pData, DataType dataType) {
	if (DataType::DataType_StructA == dataType) {
		return ((StructA*)pData)->t;
	}
	else if(DataType::DataType_StructB == dataType) {
		return ((StructB*)pData)->t;
	}
	return 0;
}

//	定义函数指针类型.
typedef __int64 (*PFN_getT)(void* pData, DataType dataType);

#include <iostream>
int main()
{
	for (int i = 0; i < DATA_SIZE; i++) {
		sa[i].t = i + 1;
		sb[i].t = i * 10 + 1;
	}
	//	输出sa和sb的t值.
	std::cout << "sa的t值" << std::endl;
	for (int i = 0; i < DATA_SIZE; i++) {
		std::cout << "sa[" << i << "].t = " << sa[i].t << std::endl;
	}
	std::cout << "sb的t值" << std::endl;
	for (int i = 0; i < DATA_SIZE; i++) {
		std::cout << "sb[" << i << "].t = " << sb[i].t << std::endl;
	}
	//	使用函数指针.
	PFN_getT pfn_getT = &getT;
	std::cout << "使用函数指针." << std::endl;
	std::cout << "sa的t值" << std::endl;
	DataType dt = DataType::DataType_StructA;
	void* pData;
	for (int i = 0; i < DATA_SIZE; i++) {
		pData = &sa[i];
		std::cout << "sa[" << i << "].t = " <<  (*pfn_getT)(pData, dt) << std::endl;
	}
	std::cout << "sb的t值" << std::endl;
	dt = DataType::DataType_StructB;
	for (int i = 0; i < DATA_SIZE; i++) {
		pData = &sb[i];
		std::cout << "sb[" << i << "].t = " << (*pfn_getT)(pData, dt) << std::endl;
	}
	return 1;
}

上述代码定义两个结构体StructA和StructB,定义了从这两个结构体获得t值的函数getT,并为该函数定义了函数指针类型PFN_getT。接着定义了两种数据的数组sa和sb。

在main函数中,首先为sa和sb的t值赋值,接着输出sa和sb的t值,最后,使用PFN_getT的实例pfn_getT输出sa和sb的值。可以比较两种输出的结果是否一致,来确定使用函数指针的结果是否正确。重要的是sa和sb的值可以借助变量pData和dt使用统一的形式“(*pfn_getT)(pData, dt)”输出,我想这也许是函数指针得到广泛应用的原因之一。

上述程序运行结果如下:

从运行结果可以看出,使用函数指针的结果与直接输出的结果一致。 但实现了形式的统一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alexabc3000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值