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 
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)”输出,我想这也许是函数指针得到广泛应用的原因之一。

上述程序运行结果如下:

C语言函数指针使用的一个例子(Win10,VS2022)_第1张图片

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

你可能感兴趣的:(函数指针,Win10,VS2022)