generic way, specific void and void*

入职这段时间真正接触了一点关于泛型的概念,所谓generic, 就是指对多种对象操作时,不用具体区分对象的类型,多所有对象都能够进行统一的API操作。

一个很常见的例子就是,一辆卡车要装货,不管它装的是水,还是食物,只要货物是打包好的标准箱子,只要执行load操作就可以了

这里想谈的一个具体的例子是关于void和void*

其中void是指“没有”,对于一个函数来讲
void func(void)
前一个void是指函数没有返回值,后一个void是指函数没有参数。
默认情况下,如果没有第一个void,编译器会默认函数返回值是int(不确定,现在已经必需要求加返回类型)
如果没有第二个void,效果一样,函数没有参数

而void*与void不同,它不是代表“没有”,而是代表不确定类型,也就是泛型指针
它出现的原因是,对于c++这种静态预言,申明就要分配内存,如果是返回不确定的类型实体,因为每种类型的内存占用大小不一样,这种情况下编译器无法确定到底使用哪一个类型,但是如果使用指针,就能很好的解决这个问题,因为指针的大小都是一样的。

memory的库中很多函数都是用void*指针来完成的,例如
memcpy  
原型:extern void *memcpy(void *dest, void *src, unsigned int count);   
用法:#include   
功能:由src所指内存区域复制count个字节到dest所指内存区域。   
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。   
注意:与strcpy相比,memcpy并不是遇到’\0’就结束,而是一定会拷贝完n个字节。

memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#include
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。

但是,不同的编译器对void*的操作有不同限制,这个有待自己尝试
C++/ANSI C
GUN C

Leave a Reply

Your email address will not be published. Required fields are marked *