打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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*

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
void *类型的变量
void和void* 的用法
C/C++语言void及void指针深层探索
15W4K58S4 实验3:空指针与位变量
malloc函数动态分配内存
const 用法总结(C++)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服