`
xpp02
  • 浏览: 1012867 次
社区版块
存档分类
最新评论

C语言union关键字

 
阅读更多
union 关键字的用法与struct 的用法非常类似。

union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。例子如下:
union StateMachine
{
char character;
int number;
char *str;
double exp;
};

一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double 型态,所以StateMachine 的空间大小就是double 数据类型的大小。

在C++里,union 的成员默认属性页为public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。

一、大小端模式对union 类型数据的影响

下面再看一个例子:
union
{
int i;
char a[2];
}*p, u;
p =&u;
p->a[0] = 0x39;
p->a[1] = 0x38;

p.i 的值应该为多少呢?

这里需要考虑存储模式:大端模式和小端模式。
  1. 大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
  2. 小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。如此一解释,上面的问题是否已经有了答案呢?

二、如何用程序确认当前系统的存储模式?

上述问题似乎还比较简单,那来个有技术含量的:请写一个C 函数,若处理器是Big_endian 的,则返回0;若是Little_endian 的,则返回1。

先分析一下,按照上面关于大小端模式的定义,假设int 类型变量i 被初始化为1。

以大端模式存储,其内存布局如下图:
以小端模式存储,其内存布局如下图:
变量i 占4 个字节,但只有一个字节的值为1,另外三个字节的值都为0。如果取出低地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是小端模式。既然如此,我们完全可以利用union 类型数据的特点:所有成员的起始地址一致。

到现在,应该知道怎么写了吧?参考答案如下:
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}

现在你可以用这个函数来测试你当前系统的存储模式了。当然你也可以不用函数而直接去查看内存来确定当前系统的存储模式。如下图:
图中0x01 的值存在低地址上,说明当前系统为小端模式。

不过要说明的一点是,某些系统可能同时支持这两种存储模式,你可以用硬件跳线或在编译器的选项中设置其存储模式。

留个问题:在x86 系统下,输出的值为多少?
#include <stdio.h>
intmain()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
分享到:
评论

相关推荐

    C语言中的所有关键字

    (1) char :声明字符型变量或函数 ...(10) union:声明共用体(联合)数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)

    C语言关键字大全(共32个)

    C语言一共有32个关键字,如下所述: auto :声明自动变量 short :声明短整型变量或函数 int: 声明整型变量或函数 long :声明长整型变量或函数 float:声明浮点型变量或函数 double :声明双精度变量或函数 char ...

    C语言、C++中的union用法总结

    主要介绍了C语言、C++中的union用法总结,本文讲解了什么是union、C中使用union、当union遇到对象等内容,需要的朋友可以参考下

    c语言入门教程.txt

    下面列出ANSI标准定义的32个C语言的关键字,这些关键字在以后的学习中基本上都会用到,到时再说它们的各自用法。 auto break case char const continue default do double else enum extern float for goto if int ...

    C语言深度解剖

    1.15 union关键字 1.16 enum关键字 1.17 typedef关键字 第二章 符号 2.1 注释符号 2.2 连接符与转义符 2.3 单引号、双引号 2.4 逻辑运算符 2.5 位运算符 2.6 花括号 2.7 ++/--操作符 2.8 2/(-2)的值是多少? 2.9 ...

    C_gjz.rar_float

    C语言中的关键字 附录2 C语言中的关键字 C语言共有32个关键字: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static...

    C语言编程中的联合体union入门学习教程

    联合体(union)在C语言中是一个特殊的数据类型,能够存储不同类型的数据在同一个内存位置。可以定义一个联合体使用许多成员,但只有一个部件可以包含在任何时候给定的值。联合体会提供使用相同的存储器位置供多用途的...

    C语言复习题目

    【1.4】下面各选项组中,均是C语言关键字的组是 。 A) auto,enum,include B) switch,typedef,continue C) signed,union,scanf D) if,struct,type 【1.5】下列不属于C语言关键字的是 。 A) default B) ...

    C语言编程宝典C语言编程宝典

    《C语言编程宝典》 说明: 作者:王大刚 分为基础篇...结构(struct) 联合(union) 枚举(enum) 函数 函数篇 (注:字母表示函数以该字母开头。) A B C D E F G H I K L M O P Q R S T U V W 图形函数 字符屏幕函数

    西北工业大学版(蒋立源第三版)编译原理课后习题答案

    3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned...

    C语言简明教程(编辑成页)

    C语言简明教程 一、基础篇 1.1Turbo C语言概述 1.2 C 语言的特点 1.3 Turbo C 概述 1.4 Turbo C 2.0的安装和启动 1.5 Turbo C 2.0集成开发...指针、结构、联合和枚举 结 构(struct) 联 合(union) 枚 举(enum)

    C语言 由ANSI标准定义的32个关键字

    auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static

    编译原理课后习题答案(蒋立源第三版)

    3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned...

    编译原理西北工业大学课后答案

    3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned...

    C语言编程宝典(全)

    1.1Turbo C语言概述 1.2 C 语言的特点 1.3 Turbo C 概述 1.4 Turbo C 2.0的安装和启动 1.5 Turbo C 2.0集成开发环境的使用 1.数据类型、变量和运算符 2.数据类型 3.关键字和标识符 4.变量 5.运算符 输入输出...

    C语言编程宝典之一,作者:王大刚

    指针、结构、联合和枚举 结 构(struct) 联 合(union) 枚 举(enum) 函数 Turbo C 程序设计初步 二,函数篇 屏幕函数 图形函数 (以下按字母顺序查询) A B C D E F G H I K L M O P Q R S T U V W

    C语言编程宝典(chm版本)

    C语言编程宝典 作者:王大刚 ...结构(struct) 联合(union) 枚举(enum) 函数 函数篇 (注:字母表示函数以该字母开头。) A B C D E F G H I K L M O P Q R S T U V W 图形函数 字符屏幕函数

    C语言编程宝典教程,HTML网页版.rar

    关键字和标识符 4.变量 5.运算符 输入输出函数及控制流程语句 文件的输入输出函数 控制流程语句 指针、结构、联合和枚举 结 构(struct) 联 合(union) 枚 举(enum) 函数 Turbo C 程序设计初步 函数篇中,主要是列...

    c语言的语法大全.doc

    派生数据类型:array, struct, union, enum 等。 指针类型:例如 int*, char* 等。 2. 变量和常量 变量:声明并分配内存空间。 常量:使用 const 关键字声明,值不可改变。 3. 运算符 算术运算符:+, -, *,...

Global site tag (gtag.js) - Google Analytics