转载

void指针详解

void指针的理解和使用都是比较复杂的,尤其与其他形式定义结合时,就显得更为复杂了。下面就综合网上一些资料,介绍一下void的用法。

1.void指针是一种特别的指针
   void *vp
  //说它特别是因为它没有类型
  //或者说这个类型不能判断出指向对象的长度

2.任何指针都可以赋值给void指针
  type *p;
  vp=p;
  //不需转换
  //只获得变量/对象地址而不获得大小

3.void指针赋值给其他类型的指针时都要进行转换
   type *p=(type*)vp;
   //转换类型也就是获得指向变量/对象大小
转:http://icoding.spaces.live.com/blog/cns!209684E38D520BA6!130.entry

4.void指针不能复引用
  *vp//错误
  因为void指针只知道,指向变量/对象的起始地址
  而不知道指向变量/对象的大小(占几个字节)所以无法正确引用

5.void指针不能参与指针运算,除非进行转换
   (type*)vp++;
  //vp==vp+sizeof(type)

因此,void*的作用大致如下:

1. 传参:通用类型

可以作为函数模板,链表等参数的通用参数。在使用时,只需要强制类型转换就可以。

2.强制类型转换

有时候由于重载等的干扰,导致需要转换成void *,来进行取地址。

例如,(void *)obj.member,就可以取到member的地址;直接&(obj.member)取到的实际上是obj的开始地址。

3.指向0的地址

(void *)0,指向全是0的地址,相当于NULL。

非void类型显式转换为void类型表达式,用于避免一些代码静态检查工具的警告。(这个还不是很懂。。求高人讲解)

正文到此结束
本文目录