用C语言来实现的类似C++函数的重载特性 - 范文中心

用C语言来实现的类似C++函数的重载特性

10/02

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

分类:c/c++ 2007-11-01 20:09 527人阅读评论(3)收藏举报

c++语言cbuffer

我们在使用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++中我们就别浪费精力在这儿了。^_~


相关内容

  • 测绘程序设计课程实习报告模板
    一.实习目的 <测绘程序设计>是一门理论与实践并重的课程,课程设计是测量数据处理理论学习的一个重要实践环节,可以看做是在学习了专业基础理论课<误差理论与测量平差基础>课程后进行的一门实践课程,其目的是增强学生对测量平 ...
  • 计算机世界最具影响力的20人
    转自: 计算机世界最具影响力的20人 1.约翰•冯•诺依曼 (John Von Neuman, 1903- 1957) 被誉为"电子计算机之父".他对人类的最大贡献是对计算机科学.计算机技术和数值分析的开拓性工作,194 ...
  • 华为面试题
    Q1:请你分别划划OSI 的七层网络结构图,和TCP/IP的五层结构图? Q2:请你详细的解释一下IP 协议的定义,在哪个层上面,主要有什么作用? TCP 与UDP 呢? Q3:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现 ...
  • c++电影院管理系统的设计
    内蒙古科技大学 课程设计论文 题 目:C++课程设计 --电影院售票管理系统 学生姓名:张雪婉 学 号:1167119224 专 业:通信工程 班 级:2011-2 指导教师:郝斌 [摘要]......................... ...
  • 计算机软件资格考试
    计算机技术与软件专业资格(水平)考试 报考指南 1.什么是计算机技术与软件专业技术资格(水平)考试? 计算机技术与软件专业技术资格(水平)考试(以下简称计算机软件资格考试),是国家人事部和信息产业部对全国计算机与软件专业技术人员进行的职业资 ...
  • 求整数中比特为1的二进制位数
    求整数中比特为1的二进制位数 分类:C/C++ 2009-11-14 01:05 1129人阅读评论(2)收藏举报 好几次在CSDN上看到别人讨论如何求出一个整数的二进制表示中状态为1的比特位数.今天写了个程序把从网上看来的加上自己想出来的 ...
  • 逆向 C -- 识别类及其构造函数 - FISH 的专栏 - CSDNBlog
    逆向 C++ 这些年来,逆向工程分析人员一直是凭借着汇编和 C 的知识对大多数软件进行逆向工程的,但是,现在随着越来越多的应用程序和恶意软件转而使用 C++语言进行开发,深入理解 C++ 面向对象方式开发的软件的反汇编技术就显得越发的必要. ...
  • 从此乱码是路人
    相信大家在刚学 Qt 的时候一定遇到过 #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QLabel lb; ...
  • 华为培训体系介绍
    华为员工培训体系介绍 华为员工培训体系介绍................................................................................................... ...