无类型指针的缺陷是无法对类型进行解释。(不能计算无类型的大小)
如,定义一个无类型指针:void *p
不能进行++p或者*p的操作,因为系统没有此地址指向对象大小的信息。
头文件string.h中定义的memcpy()函数可以实现泛型的拷贝。
函数memcpy()
原型:void* memcpy(void *dest,void *src,unsigned int n)
作用:由src所指内存区域复制n个
字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
现在我们编写自己的函数来实现泛型的拷贝。
void my_memcpy(void *di,const void *si,int size) { if(di==NULL||si==NULL) return; char *s=(char *)di; const char *p=(const char *)si; for(int i=0;i<size;i++) { s[i]=p[i]; } }
参数size表示字节个数。
之所以将无类型指针强转为char型指针,只是因为char类型的大小是1字节,这样声明可以实现一个字节一个字节地复制。
主函数中调用这个函数:
int ar[10]={12,23,34,45,56,67,78,89,90,100};
int br[10];
float dr[10]={1.2,2.3,3.4,4.5,6.7,8.9,9.0,10.0};
float xr[10];
my_memcpy(br,ar,sizeof(ar)); //40
my_memcpy(xr,dr,sizeof(dr)); //80
进一步,通过泛型拷贝来实现泛型的交换函数。
#include<stdio.h> struct Student { int id; char name[20]; int age; }; void Swap(void *a,void *b,int const n) { if(a==NULL||b==NULL) { return; } char temp; for(int i=0;i<n;++i) { temp=((char *)a)[i]; ((char *)a)[i]=((char *)b)[i]; ((char *)b)[i]=temp; } } void main() { char ca='a',cb='x'; int ia=12,ib=23; double da=12.23,db=34.34; Student sa={2017,"yhping",18}; Student sb={2018,"xcving",15}; Swap(&ca,&cb,sizeof(ca)); Swap(&da,&db,sizeof(da)); Swap(&sa,&sb,sizeof(sa)); }