利用结构体容器定义进行说明阐述C语言回调函数
TIPS: void*可以存储任何无符号整型的数据且在32位操作系统中占4个字节。通常我们称void*为万能数据类型。void**相当于存储void数据所在的地址。void本身没有任何实际的含义,不能表示任何意思,因此可以理解为:值和一级指针的维度类似于void*和void*。 void*另外也可简单的理解为二级指针,类似于一个指针数组。void为一级指针。void无任何实际含义。
数据结构定义如下:
typedef struct tagVector
{
void** pArr;
int nLen;
int nLenMax;
}TVector, * PTVector;
具体实现如下:
主要利用void*、void**、函数指针的相关知识进行实现。
int VectorInit(struct tagVector** ppv)
{
struct tagVector* pv = malloc(sizeof(TVector));
pv->nLen = 0;
pv->nLenMax = 10;
pv->pArr = malloc(sizeof(void*) * (pv->nLenMax));
*ppv = pv;
return 1;
}
typedef int(*FCallback)(void*, void*);
int VectorFindValue(PTVector pv, FCallback pFunc, void* pV, int* pIndex)
{
for (int i = 0; i < pv->nLen; ++i)
{
if (pFunc(pv->pArr[i], pV))
{
*pIndex = i;
return 1;
}
}
return 0;
}
int func(void* p1, void* pV)
{
return *(int*)p1 == *(int*)pV ? 1 : 0;
}
int main()
{
PTVector pv;
VectorInit(&pv);
int a = 10;
int index;
VectorFindValue(pv, func, &a, &index);
return 0;
}
|