一个简单的泛型交换函数
void swap(void* vp1,void* vp2,int size){//void* 表示任意类型
char buffer[size];//为交换留出存储空间
memcpy(buffer,vp1,size);//memcpy(目标地址,源地址,字节大小)
memcpy(vp1,vp2,size);
memcpy(vp2,buffer,size);
}
调用:
int s = 5;
int p = 6;
swap(&s,&p,sizeof(int));
float a = 3.54453;
float v = 634.663;
swap(&a,&b,sizeof(float));
此时交换的是s和p中的二进制位
可以发现我们交换的两个变量必须要有同样的类型
那么如果是长度不同的 字符串 呢?
看下面的代码
char* husband = strdup("Fred");
char* wife = strdup("Wilma");
swap(&husband,&wife,sizeof(char*));
声明了两个字符串的指针变量,并用strdup在堆中创建了两个字符串
此时调用swap函数,交换两个字符串指针中的地址的值
如果我们不对两个字符指针取地址,也可以运行,此时直接交换的是堆中的两个字符串的字符,由于64位系统的指针变量占8个字节,而我们的字符串太短,为了看清区别,这里size写成4
char* husband = strdup("Fred");
char* wife = strdup("Wilma");
swap(husband,wife,4);
输出如下:
Wilm
Freda
可以看到只交换了前4个字节
一个通用类型的线性搜索函数
void* lsearch(void* key,void* base,int size,int elemsize){
/*
key指向要搜索的值,base是数组基地址,
size是元素数目,elemsize是每个元素的大小
*/
for(int i=0;i<size;i++){
void* elemAddr = (char*)base + i*elemsize;//char*??
if(memcmp(key,elemAddr,elemsize)==0){
return elemAddr;
}
}
return NULL;
}
调用如下
int a[5] = {1,2,3,4,5};
int s= 3;
int* p = &s;
printf("%d\n",lsearch(p,a,5,4));
printf("%d",&a[2]);
输出如下
6422024
6422024
最后我们可以把这个函数改成
void* lsearch(void* key,void* base,
int n,int elemsize,
int(*cmpfn)(void*,void*,int))
传入一个比较函数进去,实现两个元素的比较
c语言中的qsort函数原型如下,emm有点像
static void __cdecl shortsort(char *lo, char *hi, size_t width,
int (__cdecl *comp)(const void *, const void *));
static void __cdecl swap(char *p, char *q, size_t width);
参考:
https://see.stanford.edu/Course/CS107.Programming Paradigms lecture 4