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.000001
int 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");
}
}