您的位置:首页 > 编程语言 > C语言/C++

用C语言来实现的类似C++函数的重载特性-----void*指针闲谈

2007-11-01 20:09 633 查看
我们在使用C库函数的时候经常会碰到使用void*指针的现象,以前本人作为初学者并不太明白其中的奥妙,相信很多初学者跟我有同感。

我认为这些void*的使用恰恰很巧妙的实现了函数的“重载”特性 。

典型的如内存操作函数memcpy和memset的函数原型分别为:

void * memcpy(void *dest, const void *src, size_t len);

void * memset ( void * buffer, int c, size_t num );

它们的void*都可以接受任意类型指针,例如

int i[50];

memset ( i, 0, 50*sizeof(int) ); //将intarray清0

char a[50],b[50];

memcpy ( a, b, 50*sizeof(char) ); //将b拷贝给a

我们看到void*就像一个万能的指针,来什么我就处理什么,当然函数内部的处理是关键,但是这种方法还是值得我们学习的。

关键是利用了任何类型的指针均可以对void*赋值的特性;即:

void* p;

char *s;

int *i;

p = s;//将s地址赋给p

p = i;//将i地址赋给p

但是,当要把void*赋给其他指定类型的指针时,需要将其强制转换,这点我们在使用的时候应该注意;

如上例:

s = p;//编译错误,

s = (char*) p;//正确

p++;//错误

(char*)p++;//正确

(char*) p+=1//错误

有趣的是,memcpy和memset函数返回的也是void *类型,当然这也是写一个“纯粹的,脱离低级趣味的”函数所必须的!

这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。

我们的实际运用当中可以有所借鉴,当有几个功能相同而仅仅参数类型不同的函数时,我们可以将它们并到一个用void*指针作参数的函数中,可以提高程序的可读性。

当然这仅仅是对C语言而言,C++中我们就别浪费精力在这儿了。^_~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: