加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

结构体强制类型转换

(2014-06-17 11:59:06)
标签:

杂谈

原文:http://bbs.bccn.net/thread-332391-1-1.html

在C语言中,结构体和int等类型一样,都是数据类型。其他类型怎么转换,结构体就怎么转换,没有什么特殊的地方。
楼主可能想知道的不是结构体怎样强制转换这个问题吧,猜测,楼主想知道如下几个问题:
如果将一个结构体强制类型转换为另一个结构体(或者类型),那这个结构体的成员会怎样了?
如果将一个结构体强制类型转换为另一个结构体(或者类型),那么这个结构体成员的数值又会是什么了?
解答:
1、结构体的本质是:我们和C语言约定了一段内存空间的长短,及其内容的安排。假设下面两个结构体:
struct A1
{
    int a;
    char b;
};

struct A2
{
    char a;
    int b;
};
接着,用struct A1和struct A2定义变量,并赋初值:
struct A1 x = {10, 'A'};
struct A2 y = {'A', 10};
现在最重要的是,要知道x和y的内存情况:
x的内存安排是:前4B,后1B;    //实际情况时要考虑对齐的问题,但这里不影响理解。
y的内存安排是:前1B,后4B。
如果有struct A2 z;
z.a = ((struct A2)x).a;
那么,C语言会对x的空间,按照struct A2的格局进行解释:
也就是说,将x的第一个字节看成第一个成员,且按ASCII码处理数据,而将后面的4B看成第二个成员,并按补码格式解释数据。

这里的关键是:
计算机是机器,它绝对忠实地遵守与人“先前”的约定,而不像人那样善变!
注意,要把自己当成计算机;看问题的角度改变了,那答案自然就容易得到了。


2、结构体之间的强制转换

struct str1 a;

 

struct str2 b;

a=(struct str1) b;                  //this is wrong

a=*((struct str1*)&b);         //this is correct


要注意一个问题,C语言是支持结构体实例之间的直接赋值的;而其赋值本质是:内存块赋值!将b的内存内容(当然是按照struct A1的格式和长度为基础的)直接覆盖到a所占用内存空间中!
但此时要特别注意的是:
此时的C语言是不可能关心相关内存空间的“人文内容”的!要特别注意!
以后,再使用a的时候,对a的空间当然按a本身的类型进行解释,至于解释成什么,那就需要更深的计算机原理的知识了。但这至少有一个结论:如果你对计算机原理了解不深,那么请不要使用这种你无法掌控的方法!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有