void*

指针有两个属性:指向变量/对象的地址和长度——指针存储地址,指针类型决定长度,编译器根据指针类型从指针指向的地址向后寻址,比如int* 从地址向后寻找4字节,double*从指针向后寻找8字节。

void*是一种特别的指针,表示它没有类型/类型不能判断出指向对象的长度;任何指针都能赋值给void*,但只能获得变量/对象的地址,不知道大小;void*赋值给其他类型指针时,要指明转换类型,即说明存储单元的大小。

注意:1 void* 不能复用;2 void指针不能参与指针运算

03-11
### 关于Void指针的概念及其用法 在C和C++编程中,`void *` 被称为通用指针或者空类型指针。这种类型的指针可以指向任何数据类型而无需显式转换。然而,在实际应用过程中需要注意一些特定的行为。 #### Void指针的特点 - **无类型关联**:由于`void *`不与任何具体的数据类型绑定,因此它能够存储任意对象地址。这意味着程序员可以在不知道确切目标类型的情况下传递内存位置[^1]。 - **隐式转换规则**:当涉及到不同种类的指针赋值给`void *`时,大多数情况下不需要额外的操作符来进行强制转型;但是反过来则不行——如果想把`void *`重新解释回原来的类型,则通常需要通过显示的类型转换来完成这一过程[^2]。 #### 使用场景举例 为了更好地理解如何利用`void *`实现灵活的功能设计模式,下面给出几个典型的应用实例: ##### 动态分配函数返回值 ```c++ // 假设有一个用于创建不同类型数组的方法 template<typename T> T* createArray(size_t size){ return new T[size]; } int main(){ void* ptr = (void*)createArray<int>(5); // 创建整数型动态数组并将其作为void*处理 delete[] static_cast<int*>(ptr); // 清理资源前需先转成原类型 } ``` 上述例子展示了怎样借助模板机制配合`void *`达到泛化目的的同时保持良好的可读性和安全性[^3]。 ##### 回调接口中的参数传递 另一个常见的用途是在定义回调函数签名时采用`void *userdata`形式接收外部状态信息。这种方式允许开发者自由决定附加什么性质的对象到事件处理器内部而不必担心编译期错误。 ```cpp typedef void (*CallbackFunc)(const char*, void*); class EventManager { public: void registerHandler(CallbackFunc cb, void* userData); }; void myEventHandler(const char* event_name,void* user_data){ auto obj = reinterpret_cast<MyClass*>(user_data); ... } ``` 这里说明了`void *`作为一种桥梁连接起异构组件间通信的可能性,同时也强调了适当时候应当运用静态断言或其他手段确保运行时刻的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值