C++ 中的 reinterpret_cast

C++ 11 新特性 不同数据类型之间转换函数之reinterpret_cast 它不会进行任何运行时的类型检查,也不保证转换后的对象能够正确解释。因此,除非确实需要进行底层的位模式转换,否则应该优先考虑使用其他更安全的类型转换操作符,如。)的指针后,得到的是一个指向该成员变量的指针。需要注意的是,这种转换并不保证安全性,因为不同类型之间的大小和布局可能不同,因此直接访问转换后的指针可能会导致未定义行为。将指针转换为整数后,得到的是一个表示该指针的整数值。需要注意的是,这个整数值并不是指针本身所指向的对象的值,而是指针在内存中的地址值。2. 不同类型的指针/成员指针/引用之间的转换。 阅读详情

reinterpret_cast <new_type> (expression)

reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。

什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解释(类型的比特位)。我们真的可以随意将一个类型值的比特位交给另一个类型作为它的值吗?其实不然。

IBM的C++指南里倒是明确告诉了我们reinterpret_cast可以,或者说应该在什么地方用来作为转换运算符:

  • 从指针类型到一个足够大的整数类型
  • 从整数类型或者枚举类型到指针类型
  • 从一个指向函数的指针到另一个不同类型的指向函数的指针
  • 从一个指向对象的指针到另一个不同类型的指向对象的指针
  • 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
  • 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针

不过我在Xcode中测试了一下,事实上reinterpret_cast的使用并不局限在上边所说的几项的,任何类型的指针之间都可以互相转换,都不会得到编译错误。上述列出的几项,可能 是Linux下reinterpret_cast使用的限制,也可能是IBM推荐我们使用reinterpret_cast的方式

所以总结来说:reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。

(所谓"足够大的整数类型",取决于操作系统的参数,如果是32位的操作系统,就需要整形(int)以上的;如果是64位的操作系统,则至少需要长整形(long)。具体大小可以通过sizeof运算符来查看)。

reinterpret_cast有何作用

从上边对reinterpret_cast介绍,可以感觉出reinterpret_cast是个很强大的运算符,因为它可以无视种族隔离,随便搞。但就像生物的准则,不符合自然规律的随意杂交只会得到不能长久生存的物种。随意在不同类型之间使用reinterpret_cast,也之后造成程序的破坏和不能使用。

比如下边的代码
typedef int (*FunctionPointer)(int);
int value = 21;
FunctionPointer funcP;
funcP = reinterpret_cast<FunctionPointer> (&value);
funcP(value);

我先用typedef定义了一个指向函数的指针类型,所指向的函数接受一个int类型作为参数。然后我用reinterpret_cast将一个整型的地址转换成该函数类型并赋值给了相应的变量。最后,我还用该整形变量作为参数交给了指向函数的指针变量。

这个过程编译器都成功的编译通过,不过一旦运行我们就会得到"EXC_BAD_ACCESS"的运行错误,因为我们通过funcP所指的地址找到的并不是函数入口。

由此可知,reinterpret_cast虽然看似强大,作用却没有那么广。IBM的C++指南、C++之父Bjarne Stroustrup的FAQ网页和MSDN的Visual C++也都指出:错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。

这样说起来,reinterpret_cast转换成其它类型的目的只是临时的隐藏自己的什么(做个卧底?),要真想使用那个值,还是需要让其露出真面目才行。那到底它在C++中有其何存在的价值呢?

MSDN的Visual C++ Developer Center 给出了它的使用价值:用来辅助哈希函数。下边是MSNDN上的例子:

                // expre_reinterpret_cast_Operator.cpp
// compile with: /EHsc
#include <iostream>
// Returns a hash code based on an address
unsigned short Hash( void *p ) {
	unsigned int val = reinterpret_cast<unsigned int>( p );
	return ( unsigned short )( val ^ (val >> 16));
}

using namespace std;
int main() {
	int a[20];
	for ( int i = 0; i < 20; i++ )
		cout << Hash( a + i ) << endl;
}

//如果跟我一样是64位的系统,可能需要将unsigned int改成 unsigned long才能运行。

            

这段代码适合体现哈希的思想,暂时不做深究,但至少看Hash函数里面的操作,也能体会到,对整数的操作显然要对地址操作更方便。在集合中存放整形数值,也要比存放地址更具有扩展性(当然如果存void *扩展性也是一样很高的),唯一损失的可能就是存取的时候整形和地址的转换(这完全可以忽略不计)。

不过可读性可能就不高,所以在这种情况下使用的时候,就可以用typedef来定义个指针类型:
typedef unsigned int PointerType;

这样不是更棒,当我们在64位机器上运行的时候,只要改成:
typedef unsigned long PointerType;

当reinterpret_cast面对const

IBM的C++指南指出:reinterpret_cast不能像const_cast那样去除const修饰符。这是什么意思呢?代码还是最直观的表述:


int main() 
{
	typedef void (*FunctionPointer)(int);
	int value = 21;
	const int* pointer = &value;
	
	//int * pointer_r = reinterpret_cast<int*> (pointer); 
	// Error: reinterpret_cast from type 'const int*' to type 'int*' casts away constness
	
	FunctionPointer funcP = reinterpret_cast<FunctionPointer> (pointer);
}

例子里,我们像前面const_cast一篇举到的例子那样,希望将指向const的指针用运算符转换成非指向const的指针。但是当实用reinterpret_cast的时候,编译器直接报错组织了该过程。这就体现出了const_cast的独特之处。

但是,例子中还有一个转换是将指向const int的指针付给指向函数的指针,编译顺利通过编译,当然结果也会跟前面的例子一样是无意义的。

如果我们换一种角度来看,这似乎也是合理的。因为
const int* p = &value;
int * const q = &value;

这两个语句的含义是不同的,前者是"所指内容不可变",后者则是"指向的地址不可变"(具体参考此处)。因此指向函数的指针默认应该就带有"所指内容不可变"的特性。

毕竟函数在编译之后,其操作过程就固定在那里了,我们唯一能做的就是传递一些参数给指针,而无法改变已编译函数的过程。所以从这个角度来想,上边例子使用reinterpret_cast从const int * 到FunctionPointer转换就变得合理了,因为它并没有去除const限定


C++11 reinterpret_cast讲解 我觉得C++里面有一个很神奇的转换叫reinterpret_cast(类型不相关转换),它和诸如static_cast、dynamic_cast都不一样,这种转换有时候让人摸不到头脑,但是有些场景非常有用。简而言之,类型不相关的转换。但是不是说可以随便转换,它主要用在指针与指针之间,指针和long之间等等。必要条件是两种类型之间必须有相同的位模式,而且转换过后不能直接拿来用,必须转换回来才能使用。1、研究了很久还是决定拿出来掰扯掰扯。 阅读详情

相关推荐

C++(03):reinterpret_cast

reinterpret_cast 用于转换不同类型的指针或不同类型的引用: 还可以对指针和相容的整数类型进行转换: reinterpret_cast不对其所作的转换负有安全保证。

风静如云的博客 1358

C++-----reinterpret_cast

首先从英文字面的意思理解,interpret是“解释,诠释”的意思,加上前缀“re”,就是“重新诠释”的意思;cast在这里可以翻译成“转型”(在侯捷大大翻译的《深度探索C++对象模型》、《Effective C++(第三版)》中,cast都被翻译成了转型),这样整个词顺下来就是“重新诠释的转型”。我们知道变量在内存中是以“…0101…”二进制格式存储的,一个int型变量一般占用32个位(bit),参考下面的代码

weixin_45459266的博客 3975

【037】C++中的四种强制类型转换:static_cast、const_cast、dynamic_cast和reinterpret_cast详解

在学习C++类型转换之前,了解正确的转换方式至关重要。本文深入探讨了C++中的类型转换方法,从隐式转换到动态转换,展示了安全转换的重要性。通过上行和下行转换的比较,引领读者探寻类型转换的安全边界。静态转换、动态转换和常量转换的细致解读,助您在C++编程中运用恰当的转换技巧。

Lion_Long的博客 1257

C++基础#23:C++中的reinterpret_cast,数据类型转换

C++还提供了reinterpret_cast用于任意类型的转换,即reinterpret_cast运算符允许将任意指针转换到其他指针类型,也允许做任意整数类型和任意指针类型之间的转换。转换时,执行的是逐个比特复制的操作。

记录和分享程序人生的点点滴滴 3万+

一阶电路基础知识

一阶电路(First-order circuit)是指由一个电感(L)或一个电容(C)和一个电阻(R)组成的电路。根据电感或电容的位置,一阶电路可以分为RC电路、RL电路、LC电路、RLC电路。一阶电路常用于滤波、放大、时序控制等各种电子设备和系统中。通过调整电阻、电容或电感的数值,可以改变电路的频率响应、滞后/提前相位等特性,实现不同的功能和性能一阶、二阶电路区别一阶电路由一个电容或一个电感与一个电阻组成,而二阶电路则由两个电容或两个电感与一个电阻组成。

weixin_45365488的博客 1万+

DDR4 硬件设计笔记

DDR4-DRAM是第四代支持双倍数据读取,支持随机位置存取的静态存储器。DDR4-DRAM的工作原理。DDR之T拓扑和Fly-by拓扑。DDR的硬件设计。DDR4 PCB设计要点介绍。DDR4之PCB走线间距的串扰评估。DDR4之内存通道(channel)和内存列(rank)。

qq_26815321的博客 1万+

关于C++中的reinterpret_cast

关于C++中的reinterpret_cast 功能: 1.指针和整数之间的转换 2.不同类型的指针/成员指针/引用之间的转换。 reinterpret_cast是四种强制转换中最为强大的,它可以暴力完成两个完全无关类型的指针之间或指针和数之间的转换。比如用char类型指针指向double值,例子: double a = 12.1; char* b = reinterpret_cast<char*>(&a);//将d以二进制(位模式)方式解释为char,并赋给b; double* c =

weixin_45014531的博客 1726

ubuntu20.04安装Qt5.15.2并配置环境

qt官方取消了离线安装的方式,所以推荐在线安装,当然,如果想要自己通过源码编译也可以,参考官方文档:https://wiki.qt.io/Building_Qt_5_from_Git。 在线安装: 1.到官方网站下载:wget https://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run 2.修改文件权限:chmod 777 qt-unified-linux-x64-online.run

f120854632的博客 8807

C++中的reinterpret_cast函数

是 C++ 中的一个类型转换操作符,它提供了一种低级别的转换机制,允许将任何指针(或引用)类型转换为任何其他指针(或引用)类型,以及将整数类型转换为指针类型或将指针类型转换为整数类型。基本上会告诉编译器:“我知道我在做什么,请按照我指定的方式重新解释这个类型的位模式。

979

从5V降到3.3V,你的LDO到底有多烫?手把手算功耗、选散热,避开这些坑

本文详细解析了LDO在5V转3.3V电路中的发热问题,提供了精确的功耗计算公式和散热设计方法。通过对比不同封装的热阻参数和优化PCB布局,帮助工程师有效降低LDO温度,避免热保护触发。文章还探讨了替代方案的技术拐点,为电源系统优化设计提供实用指导。

weixin_30304375的博客 435

CVPR 2027 投稿规划:基于近3年录用率与截稿周期的5步时间管理法

本文为计算机视觉研究者提供CVPR 2027投稿的完整规划指南,基于近三年录用率与截稿周期数据,提出五步时间管理法。涵盖选题策略、实验设计、论文写作、同行评审到最终提交的全流程优化,特别针对CVPR日益激烈的竞争环境(2024年投稿量达11532篇,录取率仅23.6%)提供实用解决方案,帮助研究者提升投稿成功率。

weixin_34079177的博客 1152

C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast

C/C++属于静态语言,也就是在编译时变量的数据类型即可确定的强类型语言。当不同的数据类型在一起运算或者相互赋值的时候,就需要进行数据类型转换。不同数据类型占用的内存空间不同,而各种数据类型的转换时有规则的,一种通用的规则就是“小转大”自动进行,“大转小”需要强制执行。这里的“大”和“小”指的是数据范围...

AlbertS Home of Technology 1万+

CloudCompare如何进行二次开发?

CloudCompare源代码编译成功后,即可进行二次开发,可以通过修改源码或者制作插件实现二次开发。本文二次开发采用修改CloudCompare的源代码的方式,分别修改mainwindow.ui、mainwindow.h、mainwindow.cpp,实现扩展功能,克隆选中的点云。

【cacrle】的博客 5331

浅析c++中的类型转换--reinterpret_cast

趁着热乎劲,把第四个C++中的类型转换符介绍完。首先看一下reinterpret是什么意思? reinterpret vt. 重新解释;reinterpret_cast作用为: 允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。看着上面的描述就有种放浪形骸的赶脚。更会让人不寒而栗,太随意!语法还是老样子: reinterpret_cast <

一蓑烟雨任平生 也无风雨也无晴 2万+

【WRF安装(2025)】服务器移植 WRF 安装环境

【WRF安装(2025)】服务器移植 WRF 安装环境

WW、forever的博客 106

基于AC算法的图像显著性检测及Matlab代码实现

以上是基于AC算法的图像显著性检测的Matlab代码实现。图像显著性检测是计算机视觉领域的一个重要任务,其目标是确定图像中最具有显著性的区域,即吸引人眼注意力的区域。图像显著性检测是计算机视觉领域的一个重要任务,其目标是确定图像中最具有显著性的区域,即吸引人眼注意力的区域。AC算法的原理基于人眼视觉系统的特性,人眼在观察图像时通常会先关注图像中的显著性区域,然后才会注意到其他细节。AC算法的原理基于人眼视觉系统的特性,人眼在观察图像时通常会先关注图像中的显著性区域,然后才会注意到其他细节。

TechPulseZ的博客 438

C++ 中的static_cast, reinterpret_cast的用法和区别

原文地址:https://www.cnblogs.com/heyonggang/p/3361643.html 用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的...

xiaoxiongxiongshi的博客 674

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++中的类型转换操作符:static_cast && reinterpret_cast &&const_cast && dynamic_cast(重要)

(operator +类型名)

m0_73975164的博客 1206

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【转】C++中的static_cast ,reinterpret_cast的用法和区别

转自:https://www.cnblogs.com/heyonggang/p/3361643.html 原文地址:https://www.cnblogs.com/heyonggang/p/3361643.html 用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

sinolover的专栏 609

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++中的四种cast转换, dynamic_cast、static_cast、const_cast、reinterpret_cast

C++11之后,C++中就有四种类型转换,分别是 dynamic_cast、static_cast、const_cast、reinterpret_cast,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。

qq_41841073的博客 7858

c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿

C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(exdivssion) // cast exdivssion to be of type T 这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我把...

agnes9243的博客 95

C++:C++中的类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)

C语言中的类型转换 隐式类型的转换(相近类型) 显示强制类型的转换(不相关类型) void Test() { int i = 1; // 隐式类型转换 double d = i; printf("%d, %.2f\n", i, d); // 显示的强制类型转换 int* p = &i; int address = (int)p; printf("%x, %d\n", p, ...

ETalien_的博客 428

C++中的类型转换运算符dynamic_cast、static_cast、const_cast和reinterpret_cast详解

C++中的类型转换运算符零、小序一、dynamic_cast1、关于dynamic_cast2、代码示例二、static_cast1、关于static_cast2、代码示例三、const_cast1、关于const_cast2、代码示例四、reinterpret_cast1、关于reinterpret_cast2、代码示例五、总述 零、小序 C++程序员都知道,C语言中的强制转换和万能转换指针“v...

ISmileLi的博客 726

C++中的强制类型转换:static_cast、const_cast、reinterpret_cast、dynamic_cast

在C++中,用括号方式进行强制类型转换是旧式的,比如(int)1.666。 现代的做法是用四种cast,static_cast、const_cast、reinterpret_cast、dynamic_cast,语法是cast-name(expression)。 1. static_cast 用于基础简单类之间的转换,比如int,double,char之间。 也用于有血缘关系的类指针的转换,这意味着char* 于int* 无法转换。 其他指针层级的转换请使用reinterpret_cast。 2. const

欢迎你来 264

C++中的强制类型转换关键字static_cast、dynamic_cast、reinterpret_cast和const_cast

是一种低级的、危险的转换,它可以将一种类型的指针直接转换为另一种不相关类型的指针,或者将指针转换为整数,反之亦然。用于在继承关系中进行安全的向下转换(从基类转换为派生类)。在 C++ 中,类型转换是指将一种类型的数据转换为另一种类型的数据。注意:reinterpret_cast 可能导致未定义行为,应谨慎使用,通常不推荐在一般应用程序中使用它。这些操作符比 C 风格的强制类型转换更安全和可控,提供了更精确的转换语义。限定符,但它也可以用于向对象添加这些限定符。限定的对象的值时,去掉。

Shen Mu Xin's Blog 1293

C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结

前言 这篇文章总结的是C++中的类型转换,这些小的知识点,有的时候,自己不是很注意,但是在实际开发中确实经常使用的。俗话说的好,不懂自己写的代码的程序员,不是好的程序员;如果一个程序员对于自己写的代码都不懂,只是知道一昧的的去使用,终有一天,你会迷失你自己的。 C++中的类型转换分为两种: 1.隐式类型转换; 2.显式类型转换。 而对于隐式变换,就是标准的转换,在很多时候,不经意间就发生了,比如int类型和float类型相加时,int类型就会被隐式的转换位float类型,然后再进行相加运算。而关于隐式转换不

Lee notes 448
上一篇: windows多线程
下一篇: TCM_HITTEST TCHITTESTINFO 笔记
hellosijian
博客等级 码龄16年 35粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值