栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【强制结构体指针类型转换】访问成员变量

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【强制结构体指针类型转换】访问成员变量

不同的数据类型如int,float,double以及我们通过结构体struct自己创建的数据类型,在内存所占的空间是不一样的。例如int型占四个字节,在内存的读取方式为从首地址开始读取32位的数据。

强制类型转换可以理解为首地址不变,我们把其读取方式改变。来看这样一个例子,通过这个例子可以对结构体内数据存储方式以及强制类型转换有更直观的认识。

#include
using namespace std;

struct Str
{
    int a=10;
    int b=10;
};
int main()
{
    int intr=6;
    Str gintr;
    gintr=*((Str *)&intr);
    cout< 


从上图中我们可以直观地看到对变量intr的地址进行结构体Str强制指针类型转换就相当于把&intr作为结构体Str的首地址,申请了一块在逻辑上连续的内存(在物理内存上可能不连续),范围为结构体的大小。变量a和b相当于结构体占用的这部分空间中的各自的部分,a首地址0xc000,b首地址0xc004。
当我们去访问这部分空间的时候,变量a所在空间首地址与变量intr首地址相同,并且变量a与变量intr是同一类型,所以gintr.a=6,而变量b所在的空间并没有初始化,所以这部分空间存放的是垃圾值,所以gintr.b=0。


基于这个原理,我们再来看这样一个例子:((unsigned int) &((Str *)0)->b)。
为了便于分析,将括号拿掉,语句进行拆解,可以看到这条语句可以分成这么几个步骤:

0	       							//强制转换的首地址从0x0000开始
((Str *)0)							//强制结构体指针类型转换
( ((Str *)0)->b )					//通过指针的方式访问b所在的空间
&( ((Str *)0)->b )				    //返回b所在空间的首地址
( (unsigned int) &( ((Str *)0)->b ) // 将首地址类型转换成unsigned int型
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604160.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号