招生考试网
学历| 高考 美术高考 考研 自考 成考 专升本 中考 会考 外语| 四六级 职称英语 商务英语 公共英语 日语能力 翻译资格 JTEST
资格| 公务员 报关员 银行从业 司法 导游 教师资格 报关 财会| 会计证 经济师 会计职称 注册会计 税务师 资产评估 审计师
工程| 一建 二建 造价师 造价员 咨询师 监理师 安全师 医学| 卫生资格 执业医师 执业药师 执业护士 | 教案 论文 文档
IT类| 计算机等级 计算机软考 职称计算机 高校计算机 推荐-国家公务员 事业单位招聘 军校国防生 自主招生 艺术特长生 招飞
 3773考试网 - 计算机等级考试 - 高校计算机 - 正文

c/c++void及void指针类型

来源:fjzsksw.com 2009-11-4 10:42:39

因此下列语句在GNU编译器中皆正确:

  pvoid++; //GNU:正确

  pvoid += 1; //GNU:正确

  pvoid++的执行结果是其增大了1。( 在VC6.0上测试是sizeof(int)的倍数)

  在实际的程序设计中,为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:

  void * pvoid;

  (char *)pvoid++; //ANSI:正确;GNU:正确

  (char *)pvoid += 1; //ANSI:错误;GNU:正确

  GNU和ANSI还有一些区别,总体而言,GNU较ANSI更“开放”,提供了对更多语法的支持。但是我们在真实设计时,还是应该尽可能地迎合

  ANSI标准。

  规则四如果函数的参数可以是任意类型指针,那么应声明其参数为void *

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

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

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

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

  论这片内存是什么类型。如果memcpy和memset的参数类型不是void *,而是char *,那才叫真的奇怪了!这样的memcpy和memset明显不是一个

  “纯粹的,脱离低级趣味的”函数!

  下面的代码执行正确:

  //示例:memset接受任意类型指针

  int intarray[100];

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

  //示例:memcpy接受任意类型指针

  int intarray1[100], intarray2[100];

  memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2拷贝给intarray1

  有趣的是,memcpy和memset函数返回的也是void *类型,标准库函数的编写者是多么地富有学问啊!

上一页  [1] [2] [3] [4] 下一页



  • 上一个文章:
  • 网站版权与免责声明
    ①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
    ②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权及个人隐私等问题,请在两周内邮件fjksw@163.com联系.
    最新文章


    | 关于我们 | 联系我们 | 版权申明 | 网站导航 |
    琼ICP备12003406号