void *cp //通用指针、泛型指针,用于临时储存地址。
缺点:1、不能解引用,及*cp(错误)。2、不能进行算术运算。cp++(错误)。
malloc 动态创建内存,返回一个泛型指针。
动态内存最大的问题:内存泄漏。
#include<stdio.h>#include<stdlib.h>#include<string.h>
/*void Swap(void *vp1,void *vp2,int size)//泛型交换,size表示交换内容的字节长度{ char *tmp = (char*)malloc(size);//创建动态内存,用作临时存储。 memcpy(tmp,vp1,size);//内存拷贝 memcpy(vp1,vp2,size); memcpy(vp2,tmp,size); free(tmp);//释放内存}
int main(){ int a = 10; int b = 20; Swap(&a,&b,sizeof(int)); printf("%d %d\n",a,b); float m = 12.89f; float n = 20.09f; Swap(&m,&n,sizeof(float)); printf("%f %f\n",m,n);}*/
/*void My_memcpy(void *vp1,void *vp2,int size)//实现内存拷贝{ char *cp1 = (char*)vp1; char *cp2 = (char*)vp2; if(cp1<cp2) { for(int i = 0;i<size;i++) { cp1[i] = cp2[i]; } } else { for(int i = size-1;i>=0;i--) { cp1[i] = cp2[i]; } }}
void Swap(void *vp1,void *vp2,int size){ char *tmp = (char*)malloc(size); My_memcpy(tmp,vp1,size); My_memcpy(vp1,vp2,size); My_memcpy(vp2,tmp,size); free(tmp);}
int main(){ int a = 10; int b = 20; Swap(&a,&b,sizeof(int)); printf("%d %d\n",a,b); float m = 12.89f; float n = 20.09f; Swap(&m,&n,sizeof(float)); printf("%f %f\n",m,n);}*/
/*void Swap1(void *str,void *des,int size)//不使用memcpy函数实现的泛型交换{ char *tmp = (char*)malloc(size); char *cp1 = (char*)str; char *cp2 = (char*)des; for(int i = 0;i<size;i++) { tmp[i] = cp1[i]; } for(int i = 0;i<size;i++) { cp1[i] = cp2[i]; } for(int i = 0;i<size;i++) { cp2[i] = tmp[i]; }
}
int main(){ int a = 10; int b = 20; Swap1(&a,&b,sizeof(int)); printf("%d %d\n",a,b); float m = 12.89f; float n = 20.09f; Swap1(&m,&n,sizeof(float)); printf("%f %f\n",m,n);}*/
typedef int (*Pcmp) (void *vp1,void *vp2);//回调函数
int Search(void *arr,int len,void *p_key,int elemsize,Pcmp cmp)// elemsize 一个单元格的大小,cpm 判断是否相等的依据。{ char *cp1; for(int i = 0;i<len;i++) { cp1 = (char*)arr+i*elemsize; if(cmp(cp1,p_key)==0) { return i; } } return -1;}
int int_cmp(void *cp1,void *cp2){ return *(int*)cp1 - *(int*)cp2;}
#define EPS 0.000001int double_cmp(void *cp1,void *cp2){ double tmp = *(double*)cp1-*(double*)cp2; if(-EPS<tmp&&tmp<EPS)//浮点数如何与0相等。定义一个误差,若在误差之内则判断与0相等 { return 0; } else return -1;}
typedef struct Student//结构体,自定义数据类型{ char name[20]; int score;}Student;
int Stu_na_cmp(void *cp1,void *cp2){ return strcmp(((Student *)cp1)->name,(char *)cp2);//通过结构体指针访问它的成员使用—>}int Stu_sco_cmp(void *vp1,void *vp2){ return ((Student *)vp1)->score - *(int *)vp2;}
int main(){ int str[] = {12,23,34,0,9,23,54}; int m = 34; int n = 13; int p = Search(str,sizeof(str)/sizeof(str[0]),&m,sizeof(int),int_cmp); if(p >=0 ) { printf("%d\n",str[p]); } else { printf("无此数\n"); }
int key = Search(str,sizeof(str)/sizeof(str[0]),&n,sizeof(int),int_cmp); if(key >=0 ) { printf("%d\n",str[key]); } else { printf("无此数\n"); }
double brr[5] = {11.89,13.54,14.76,34.56,56.79}; double dkey = 34.56; int index = Search(brr,5,&dkey,sizeof(double),double_cmp); if(index >=0 ) { printf("%f\n",brr[index]); } else { printf("无此数\n"); }
Student des[2]={"xiaoming",23,"xaiohong",45}; int score = 23; int mkey = Search(des,2,&score,sizeof(Student),Stu_sco_cmp); if(mkey >=0 ) { printf("%s,%d\n",des[mkey].name,des[mkey].score); } else { printf("无此人\n"); } }
转载于:https://www.cnblogs.com/97-5-1/p/7361181.html
相关资源:泛型编程与STL(自制完整详细目录) 侯捷译