云飞扬

无止境放纵,咆哮吧

用户操作
[即时聊天] [发私信] [加为好友]
yekyID:lvyexiaozi
193次访问,排名2万外好友3人,关注者3
行业:软件产业,爱好:篮球.职业:在校生.
lvyexiaozi的文章
原创 0 篇
翻译 0 篇
转载 5 篇
评论 0 篇
最近评论
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 union和struct的区别收藏

    新一篇: 数据类型基本概念 | 旧一篇: 关于内存中栈和堆的区别

     首先看看union,在c++中,union可能没有多大用处,在c语言中,可能我们要借助其完成很多巧妙的设计,下面是其一个完整的定义:

            union UTest         {              double dlOne;              char   chOne;              byte   bArray[4];         };

            好了,看到上面的定义,很像struct的定义,但是对于union来说,有几点是值得注意的:不能直接对其进行初始化;某个时候只能使用其中的一个元素;最后一点也是最重要的一点就是内存共享,分配给union内存的Size是其中Size最大的那个元素的Size。说到这里,既然union最重要的是内存共享,那么我们做如下定义:union UTest tEle;然后赋值:tEle.dlOne = 2.0f;现在是dlOne可用,下一步:tEle.chOne = 'A';到这里dlOne失去了其意义,chOne变得可用。

            然后,我们再来看看Struct,在struct中每一个元素都是分配内存的,而且都是有单独意义的,也就是说对一个变量的赋值并不影响其它变量的取值。到这里,各位应该明白这两者之间的区别了吧,事实上我个人认为,它们最主要的区别是在内存的分配和使用上。知道这一点,一切也就不难理解了。

            最后,在使用union的时候,可能有时候我们会来用其来对字节流进行分解和重组,这样使用的时候一定要注意各种内存对数据的存储,比如Intel是按高高低低的原则存储的,有些则是相反的。因此,这点因该值得注意,否则得到的可能和预期的结果不一样。

    举例:使用union结构输出主机字节序

    int main ( void ) { union { short s; char c[sizeof(shor)]; }un; un.s = 0x0102; printf ( "%s:", CPU_VENDOR_OS ); if ( 2==sizeof(short) ) { if ( 1==un.c[0] && 2==un.c[1]) { printf ( "big-endian\n" ); } else if ( 2==un.c[0] && 1==un.c[1] ) { printf ( "little-endian\n" ); } else { printf ( "unknown\n" ); } } else { printf ( "sizeof(short) = %d\n", sizeof(short) ); } return 0; }

    发表于 @ 2008年07月07日 15:27:29|评论(loading...)|收藏

    新一篇: 数据类型基本概念 | 旧一篇: 关于内存中栈和堆的区别

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © yeky