C语言也可以实现泛型(转)

原文地址:https://www.cnblogs.com/wuyudong/p/c-general-function1.html

#include<string.h>
#include<stdio.h>
// C 语言也可以实现一定的泛型编程,但这样是不安全的,系统对其只有有限的检查。在编程时一定要多加细心。
/*变量是不能声明为 void 无类型的。而你不知道调用此函数传进的参数是什么类型的,无法确定一种类型的声明。
同时,不能将 * 用在无类型指针上,因为系统没有此地址指向对象大小的信息。在编译阶段,编译器无法得知传入此函数参数的类型的*/
void swap(void*v1,void*v2,int size){
	char buffer[size];
	memcpy(buffer,v1,size);
	memcpy(v1,v2,size);
	memcpy(v2,buffer,size);
}
void* search(void*key,void*base,int n,int elementSize){
	for(int i=0;i<n;i++){
		void*element = (char*)(base)+ i*elementSize;
		if(memcmp(key,element,elementSize)==0)
			return element;
	}
	return NULL;
}
int intCmp(void*elem1,void*elem2){
	int* e1 = (int*)elem1;
	int* e2 = (int*)elem2;
	return *e1-*e2;
}
void * search1(void*key,void*base,int n,int elementSize,int(*cmpfn)(void*,void*)){
	for(int i=0;i<n;i++){
	void*element = (char*)base+ i*elementSize;
	if( cmpfn(key,element)==0)
		return element;
	}
	return NULL;
} 
int main(){
	// 1、交换值
	int x=0,y=1;	
	printf("x=%d,y=%d\n",x,y);
	swap(&x,&y,sizeof(int));
	printf("x=%d,y=%d\n",x,y);
	int a[10];
	for(int i=0;i<10;i++)	a[i] = i+1;
	int key=8;
	// 2、查找	
	if(search(&key,&a,10,sizeof(int))!=NULL) {
		printf("Founded\n");
	}else{
		printf("NULL\n");
	}
	// 3、查找 
	int*found = (int*)search1(&key,&a, 10, sizeof(int),intCmp);
	if(found!=NULL) {
		printf("Founded\n");
	}else{
		printf("NULL\n");
	}
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值