内置数据类型:
代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//回调函数---通用数组型打印案例
//参数1:数组首地址 参数2:数组中每个元素的大小 参数3:数组元素个数 参数4:回调函数对数组内容进行输出
void printArray(void* array, int size, int len, void(*MyPrint)(void *))
{
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
char* p = (char*)array;
for (int i = 0; i < len; i )
{
//获取数组中每个元素的首地址----指针的步长
char* eleAddr = p size * i;
//MyPrint(array[i]);是错误的----没有void*数组的概念
MyPrint(eleAddr);
}
}
void myPrint(void* data)
{
int* num = (int*)data;
printf("%d ", *num);
}
void test()
{
int arr[5] = { 1,2,3,4,5 };
int len=sizeof(arr) / sizeof(arr[0]);
printArray(arr, sizeof(int), len, myPrint);
}
int main()
{
test();
return 0;
}
自定义数据类型:
代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//回调函数---通用数组型打印案例
//参数1:数组首地址 参数2:数组中每个元素的大小 参数3:数组元素个数 参数4:回调函数对数组内容进行输出
void printArray(void* array, int size, int len, void(*MyPrint)(void *))
{
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
char* p = (char*)array;
for (int i = 0; i < len; i )
{
//获取数组中每个元素的首地址----指针的步长
char* eleAddr = p size * i;
//MyPrint(array[i]);是错误的----没有void*数组的概念
MyPrint(eleAddr);
}
}
struct person {
char ch[32];
int age;
};
void myPrint(void* data)
{
person* p = (person*)data;
printf("姓名:%st年龄:%dn", p->ch, p->age);
}
void test()
{
person p[5] = {
{"大忽悠",18},
{"小忽悠",18},
{"小朋友",19},
{"大朋友",19},
{"happy end",100},
};
printArray(p, sizeof(person), 5, myPrint);
}
int main()
{
test();
return 0;
}
增加查找的功能:
代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//查找元素
//参数1:数组首地址 参数2:数组中每个元素的大小 参数3:数组元素个数 参数4:查找的元素
//参数5:回调函数,将data传入回调函数,更据用户需求进行对比操作,对比函数由用户自己写
int findArrEle(void* arr, int size, int len, void* data,int(*compare)(void*,void*))
{
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
char* p = (char*)arr;
for (int i = 0; i < len; i )
{
//获取数组中每个元素的首地址----指针的步长
char* eleAddr = p size * i;
if (compare(eleAddr,data))
{
return 1;
}
}
return 0;
}
struct person {
char ch[32];
int age;
};
//对比的函数
int compare(void*eleAddr, void*data)
{
person* p1 = (person*)eleAddr;
person* p2 = (person*)data;
if (strcmp(p1->ch,p2->ch)==0 && p1->age == p2->age)
{
return 1;
}
return 0;
}
void test02()
{
person p[5] = {
{"大忽悠",18},
{"小忽悠",18},
{"小朋友",19},
{"大朋友",19},
{"happy end",100},
};
person p1 = { "大忽悠",18};
int ret=findArrEle(p, sizeof(person), 5, &p1, compare);
if (ret==1)
printf("查到");
else
printf("没查找到");
}
int main()
{
test02();
return 0;
}