分享

关于void*的类型转换问题 - VC Effect的日志 - 网易博客

 wfsy1983 2010-08-14

void的含义

void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。

void指针使用规范

①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:

int *pint;

void *pvoid;

pvoid = pint; /* 不过不能 pint = pvoid; */

如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint = (int *)pvoid;

②在ANSI C标准中,不允许对void指针进行算术运算如pvoid++或pvoid+=1等,而在GNU中则允许,因为在缺省情况下,GNU认为void *与char *一样。sizeof( *pvoid )== sizeof( char ).

void的作用

①对函数返回的限定。

②对函数参数的限定。

当函数不需要返回值时,必须使用void限定。例如: void func(int, int);

当函数不允许接受参数时,必须使用void限定。例如: int func(void)。

由于void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值,因此还可以用void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。例如:

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

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

指向void 的指针

一个指向任何对象 类型的指针都可以赋值给类型为void* 的变量,void* 可以赋值给另一个void* ,两个void* 可以比较相等与否,而且可以显式地将void* 转换到另一个类型。其它操作都是不安全的,因为编译器并不知道实际被指的是哪种对象。因此,对void* 做其他任何操作都将引起编译错误。要使用void*,就必须显式地将经转换到某个指向特定类型的指针。

例:

void Test(int *pi)

{

void *pv = pi; //ok ,从 int* 到 void* 的隐式转换

*pv ; //错误:void* 不能间接引用

pv++; //错误:void* 不能增量(不知道被指定类型的大小)

int *pi1 = static_cast<int*>(pv); //ok: 显式转换回 int*

double * pi2 = pv; //错误

double *pi3 = pi; //错误

double *pi4 = static_cast<double*>(pv); //ok: 不安全

}

1.一般来说,如果一个指针被转换(“强制”,cast)到与被批对象的实际类型不同的指针,使用后一个指针就是不安全的。 void* 的最重要用途是需要向函数货传递一个指针,而又不能对对象的类型做任凭假设。还有就是从函数返回一个无类型的对象。要使用这样的对象。必须通过显式的类型转换。

2,到函数的指针与到成员的指针都不能赋给void*

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多