void* 指针

本文介绍了void*指针的用途,它能存放任意对象的地址但不包含类型信息,因此不能直接访问对象。void*常用于函数参数传递和比较,以及在内存分配中与operatornew的交互。C++中规定了void*与其他指针及常量整数的转换规则,并列出了四个版本的operatornew函数,它们返回类型为void*,适应不同的异常处理需求。

void* 是一种特殊的指针类型,可用于存放任意对象的地址。        

        float obj = 3.1415;

        void* pv = &obj;

一个void*指针存放着一个地址,这一点和其他指针类似。 不同的是,对地址中到底是什么类型的对象并不知道。因此不能直接操作void*指针所指的对象,因为不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。   

void* 指针不能访问内存空间中所存的对象,仅仅是能把任意对象的地址存放到内存空间。

利用void*指针能做的事比较有限:

        1. 和别的指针比较

        2. 作为函数的输入或输出

        3. 赋给另一个void* 指针

C++中规定,常量整数值0  或  字面值nullptr 能转换成任意指针类型 ;指向任意非常量的指针  能转换成 void* ;  指向任意对象的指针  能转换成 const void*。

在控制内存分配中,当使用new创建对象时:

        string *sp = new string("a value") ;

        string *arr = new string[100] ;

实际执行了三步操作:

第一步,new表达式调用一个名为 operator new 和 operator new[] 的标准库函数。该函数分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象 或 对象数组。

第二步,编译器运行相应的构造函数以构造这些对象,并为其传入初始值。

第三步,对象被分配了空间并构造完成,返回一个指向该对象的指针。

标准库定义了 4 个重载版本的operator new函数:

void* operator new(size_t) ;//分配一个对象 ,可能抛出异常

void* operator new[](size_t);//分配一个数组,可能抛出异常

void* operator new(size_t,  nothrow_t&) noexcept;//分配一个对象 ,不会抛出异常

void* operator new[](size_t,  nothrow_t&) noexcept; //分配一个数组 ,不会抛出异常

对于 operator new 函数或者 operator new[]函数来说,它的返回类型必须是void*。(因为void* 可存放任意对象的地址)

总结:

        void* 指针可用于存放任意对象的地址, 不能访问内存空间中所存的对象,仅仅是能把任意对象的地址存放到内存空间。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值