通用类型的SWAP函数的实现
void swap(void *vp1,void *vp2,int size){
char buffer[size]; //也可用malloc获取一块size大的内存
memcpy(buffer,vp1,size);
memcpy(vp1,vp2,size);
memcpy(vp2,buffer,size);
}
//调用举例
int n1=5,n2=6;
swap(&n1,&n2,sizeof(int));
char *s1="ming",*s2="li";
swap(&s1,&s2,sizeof(char **)); //字符串不等长,不能交换字符串,交换指针
通用类型数组的线性搜索函数的实现
void *lSerch(void *key,void *base,int n,int elemSize){
void *elemAddr;
for(int i;i<n;i++){
elemAddr=(char *)base+i*elemSize;
if(memcmp(elemAddr,key,elemSize)==0)
return elemAddr;
}
return NULL;
}
上述函数在数组是存储shor,int,long,float,double,char
等类型的元素都可用,因为这些类型内存存储长度固定,但对于char *arr[]
存储字符串数组不适用,为了解决这个问题,增加函数的通用性,可以在上述函数中增加一个函数指针的参数,用这个函数调用一个自定义的比较函数,实例如下
void *lSearch(void *key,void *base,int total_n,int elemSize,int (*cmpfn)(void *,void *)){
void *elemAddr;
for(int i=0;i<total_n;i++){
elemAddr=(char *)base+i*elemSize;
if(!cmpfn){
if(memcmp(elemAddr,key,elemSize)==0)
return elemAddr;
}else{
if(cmpfn(elemAddr,key)==0)
return elemAddr;
}
}
return NULL;
}
//字符串数组搜索范例
int strCmp(void *vp1,void *vp2){
char *s1=*(char**)vp1; //不要写成s1=(char *)cp1;s1获取的值不一样
char *s2=*(char**)vp2;
return strcmp(s1,s2);
}
int main(){
char *key="abc";
char *arrc[]={"cc","bc","abc","dd"};
char *find=lSearch(&key,arrc,4,sizeof(char *),strCmp);
}