【C++数据类型】C++中的类型转换(三)

下面,主要介绍下C++中的reinterpret_cast<>重解释类型转换,它主要用于将一种类型的指针或者引用转换成另外一种类型的指针或者引用。

我们先看一个例子:

#include<iostream>
using namespace std;

int main()
{
	int i=100;
	int* pi=&i;
	double* dpi=pi;
	cout<<*pi<<endl;
	return 0;
}

我们知道,int类型的数据可以隐式转换成double类型的数据,那么int*能否隐式转换成double*呢?
答案是否定的,编译出现以下错误:

Hyman@Hyman-PC cplus]$ g++ reinterpret_cast.cpp -o reinterpret
reinterret_cast.cpp: In function ‘int main()’:
reinterret_cast.cpp:8: 错误:不能将‘int*’转换为‘double*’,在 initialization 中

那么用静态类型转换static_cast<>能否进行转换呢?将代码修改如下:

#include<iostream>
using namespace std;

int main()
{
	int i=100;
	int* pi=&i;
	double* dpi=static_cast<double*>pi;
	cout<<*pi<<endl;
	return 0;
}

发现仍没有转换成功。因为静态类型转换在转换前,先要检查反方向能否隐式转换成功,很显然int*转成double*的反方向double*转成int*也无法隐式转换成功,所以static_cast<>对此也无能为力。

[Hyman@Hyman-PC cplus]$ g++ reinterpret_cast.cpp -o reinterpret
reinterret_cast.cpp: In function ‘int main()’:
reinterret_cast.cpp:8: 错误:从类型‘int*’到类型‘double*’中的 static_cast 无效
这时我们就需要利用reinterpret_cast<>重解释转换:


#include<iostream>
using namespace std;

int main()
{
	int i=100;
	int* pi=&i;
	double* dpi=reinterpret_cast<double*>(pi);
	cout<<*dpi<<endl;
	return 0;
}

重新编译,转换成功:

[Hyman@Hyman-PC cplus]$ g++ reinterpret_cast.cpp -o reinterpret
[Hyman@Hyman-PC cplus]$ ./reinterpret  -0.0128227

接下来,请思考一下,这种重解释转换在实际开发中有什么用呢?
先看下面一个例子:
在网络编程中,很多时候我们通过socket传输过来一系列字节流,比如"liuzhihui\000123456\000",前面9位(包含‘\000’)表示账户名,后面7位(包含‘\000’),这是我们要解析出这些
字节流代表的数据,就可以通过重解释转换reinterret_cast<>:

#include<iostream>
using namespace std;

int main()
{
	char* message="liuzhihui\000123456\000";
	struct Msg
	{
		char name[10];
		char password[7];
	};
	Msg* pmsg=reinterpret_cast<Msg*>(message);
	cout<<pmsg->name<<","<<pmsg->password<<endl;
	return 0;
}

通过重解释,我们就很方便的把字节流转换成我们自定义的结构体指针,可以快速的实现了字节流的解析

[Hyman@Hyman-PC cplus]$ ./reinterpret 
liuzhihui,123456



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值