现在的位置: 首页 > 综合 > 正文

C语言中union与struct的区别

2013年08月05日 ⁄ 综合 ⁄ 共 2252字 ⁄ 字号 评论关闭

    在C语言中结构体和联合具有细微差别,特别是使用sizeof()对其求大小时,许多刚刚接触C语言不久的朋友对此非常困惑,下面我将简单谈以下自己对union与struct之间的区别

联 合(union) 
1. 联合说明和联合变量定义 
联合也是一种新的数据类型, 它是一种特殊形式的变量。 
联合说明和联合变量定义与结构十分相似。其形式为: 
union 联合名{ 
数据类型 成员名; 
数据类型 成员名; 
... 
} 联合变量名; 
联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。 


union A
{
   int a[5];
   char b;
   double c;
   
}Air;

表示声明了一个名称为A的联合,可以使用A  variable 来定义联合变量。

在联合变量 variable中 整型和字符型以及double型公用同一内存位置。

当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度。 
联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用"->"符号, 此时联合访问成员可表示成: 
联合名->成员名 
另外, 联合既可以出现在结构内, 它的成员也可以是结构。 
 

 union
 {
   int i;
   struct
   {
  char first;
  char second;
 }half;
 
  }number;


2.结构的定义

定义一个结构的一般形式为: 
struct 结构名 

成员表列 
};
成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:
类型说明符 成员名; 
成员名的命名应符合标识符的书写规定。例如: 
struct stu
{
int num;
char name[20];
char sex;
float score;
}; 
  在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为 sex,字符变量;第四个成员为score,实型变量。 应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。 凡说明为结构stu的变量都由上述4个成员组成。由此可见, 结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。


在介绍了结构和联合得基本知识后,我们开始今天要讲的关于sizeof对结构体和联合求值问题:

让我们来看一道华为的面试题:

例:设有以下说明和定义: 
  typedef  union   {long   i;   int  k[5];   char   c;} DATE; 
  struct  data   {   int   cat;  DATE   cow;   double   dog;}   too; 
  DATE   max; 
  则语句   printf( "%d",sizeof(struct   date)+sizeof(max));的执行结果是:____

需要说明的是typedef只是一个简单的名字替换,方便系统在不同的平台上移植,请参考以下例子:

/*
  Name: typedef
  Copyright: reserved
  Author: persever
  Date: 02-08-11 03:51
  Description: 
*/
#include <stdio.h>
#include <stdlib.h> 
int main()
{
  typedef  int Example;
  Example a=10;//Equals to int a=10;
 
  printf("%d\n",a);
  system("pause");
}

解释:假设为32位机器,那么DATE是一个union,   变量公用空间.   里面最大的变量类型是int[5],   占用20个字节.   所以它的大小是20,data是一个struct,   每个变量分开占用空间.   依次为int4   +   DATE20   +   double8  
=   32. 
所以结果是   20   +   32   =   52. 

再看下例:

设有以下说明和定义: 
  typedef  union   {double   i;   int  k[5];   char   c;} DATE; 
  struct  data   {   int   cat;  DATE   cow;   double   dog;}   too; 
  DATE   max; 
  则语句   printf( "%d",sizeof(struct   date)+sizeof(max));的执行结果是:____

在草率回答这一问题之前我们先看一个小例子:

#include <stdio.h>
#include <stdlib.h> 
union A
{

int a[5];

char b;

double c;
};
int main()
{
   printf("%d\n",sizeof(A));
   system("pause");
}

对A用sizeof输出却得到的是24!union中变量共用内存,应以最长的为准,可是结果却不是我们预想的20,这是因为在联合内变量的默认内存对其方式,必须以最长的double8字节对齐,也就是说故应该是sizeof(A)=24;所以我们将联合中的int a[5] 修改成 int a[6] 结果仍然不变,但如果我们将int
a[5]修改成 int a[7],结果就变成了 32了。


另外简单说一下结构体和类的区别:

个人认为唯一是访问权限的不同,结构体默认的访问权限是公有的,而类的默认访问权限是私有的。

欢迎各位批评斧正!

抱歉!评论已关闭.