用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++中我们就别浪费精力在这儿了。^_~
我认为这些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++中我们就别浪费精力在这儿了。^_~
相关文章推荐
- 利用C++重载实现类似“类成员指针”的功能
- 使用c++的成员指针实现类似Borland VCL组件的事件回调
- C++学习笔记(八):函数重载、函数指针和函数对象
- 如何用Java实现类似c/c++指针效果
- Java利用接口和类来实现类似函数指针的功能
- C语言实现类中方法 用函数指针在结构体中加入函数
- 用C语言实现函数void * memmove(void *dest, const void *src, size_t n)
- C++之函数指针实现函数回调
- C++ 函数重载、指针及引用
- C++回顾之成员函数重载、类与结构体、this指针
- 2.C语言实现函数void *memmove(void *dest, const void *src, size_t n)。memmove 函数的功能是拷贝src所指的内存内容前n个字节到dest所指
- java中实现类似函数指针的功能
- C语言 复杂指针的申明问题 数组指针 指针数组 函数指针 指针函数一览无遗! C/C++求职面试必备考点(四)
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- extern static 的作用和注意点 && c++如何实现函数的重载
- 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- 第八章 C++函数的高级特性(8.2 成员函数的重载、覆盖与隐藏)
- 如何在C++中实现类似Scanf的变参个数函数
- c++ 指针、引用、内存管理、函数(引用、重载、内敛)——c++复习(一)
- C++中实现类似C中rewind函数功能