`

c语言中的struct和union

阅读更多
联       合(union)

1. 联合说明和联合变量定义

    联合也是一种新的数据类型, 它是一种特殊形式的变量。
    联合说明和联合变量定义与结构十分相似。其形式为:
     union 联合名{
          数据类型 成员名;
          数据类型 成员名;
          ...
     } 联合变量名;
    联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。
    下例表示说明一个联合a_bc:
    
union a_bc{ 
          int i; 
          char mm; 
     }; 
    再用已说明的联合可定义联合变量。
    例如用上面说明的联合定义一个名为lgc的联合变量, 可写成:
     
union a_bc lgc;

    在联合变量lgc中, 整型量i和字符mm公用同一内存位置。
    当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度。
    联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用"->;"符号, 此时联合访问成员可表示成:
     联合名->;成员名
    另外, 联合既可以出现在结构内, 它的成员也可以是结构。
    例如:
    
struct{ 
          int age; 
          char *addr; 
          union{ 
               int i; 
               char *ch; 
          }x; 
     }y[10]; 

    若要访问结构变量y[1]中联合x的成员i, 可以写成:
      y[1].x.i;
    若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:
      *y[2].x.ch;
    若写成"y[2].x.*ch;"是错误的。

2. 结构和联合的区别

结构和联合有下列区别:
    1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合转只存放了一个被选中的成员, 而结构的所有成员都存在。
    2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
    下面举一个例了来加对深联合的理解。
    例4:
main() 
{ 
    union{                   /*定义一个联合*/ 
    int i; 
    struct{             /*在联合中定义一个结构*/ 
              char first; 
              char second; 
             }half; 
    }number;

    number.i=0x4241;         /*联合成员赋值*/ 
    printf("%c%c\n", number.half.first, mumber.half.second); 
    number.half.first='a';   /*联合中结构成员赋值*/ 
    number.half.second='b'; 
    printf("%x\n", number.i); 
    getch(); 
} 
    输出结果为:
     AB
     6261
    从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。






c语言中的结构(struct)和联合(union)简介


结构类型定义和结构变量说明

  在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型----“结构”。它相当于其它高级语言中的记录。

  “结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。

一、结构的定义

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

二、结构类型变量的说明

说明结构变量有以下三种方法。以上面定义的stu为例来加以说明。
1. 先定义结构,再说明结构变量。如:
struct stu
{
int num;
char name[20];
char sex;
float score;
};
struct stu boy1,boy2;
说明了两个变量boy1和boy2为stu结构类型。也可以用宏定义使一个符号常量来表示一个结构类型,例如:
#define STU struct stu
STU
{
int num;
char name[20];
char sex;
float score;
};
STU boy1,boy2;

2. 在定义结构类型的同时说明结构变量。例如:
struct stu
{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;

3. 直接说明结构变量。例如:
struct
{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;

  第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。三种方法中说明的boy1,boy2变量都具有图7.1所示的结构。说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。在上述stu结构定义中,所有的成员都是基本数据类型或数组类型。成员也可以又是一个结构, 即构成了嵌套的结构。例如,图7.2给出了另一个数据结构。 按图7.2可给出以下结构定义:
struct date{
int month;
int day;
int year;
}
struct{
int num;
char name[20];
char sex;
struct date birthday;
float score;
}boy1,boy2;
  首先定义一个结构date,由month(月)、day(日)、year(年)三个成员组成。在定义并说明变量 boy1 和 boy2 时, 其中的成员birthday被说明为data结构类型。成员名可与程序中其它变量同名,互不干扰。结构变量成员的表示方法在程序中使用结构变量时, 往往不把它作为一个整体来使用。

  在ANSI C中除了允许具有相同类型的结构变量相互赋值以外, 一般对结构变量的使用,包括赋值、输入、输出、 运算等都是通过结构变量的成员来实现的。

  表示结构变量成员的一般形式是: 结构变量名.成员名 例如:boy1.num 即第一个人的学号 boy2.sex 即第二个人的性别 如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。例如:boy1.birthday.month 即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。

结构变量的赋值

前面已经介绍,结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。
[例7.1]给结构变量赋值并输出其值。

main(){
   struct stu
   {
      int num;
      char *name;
      char sex;
      float score;
   } boy1,boy2; 
   
   boy1.num=102;
   boy1.name="Zhang ping";
   printf("input sex and score\n");
   scanf("%c %f",&boy1.sex,&boy1.score);
   boy2=boy1;
   printf("Number=%d\nName=%s\n",boy2.num,boy2.name);
   printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);
}
  本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。最后分别输出boy2 的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。

结构变量的初始化
  如果结构变量是全局变量或为静态变量, 则可对它作初始化赋值。对局部或自动结构变量不能作初始化赋值。
[例7.2]外部结构变量初始化。

struct stu /*定义结构*/
{
   int num;
   char *name;
   char sex;
   float score;
} boy2,boy1={102,"Zhang ping",'M',78.5};

main()
{
   boy2=boy1;
   printf("Number=%d\nName=%s\n",boy2.num,boy2.name);
   printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);
}
本例中,boy2,boy1均被定义为外部结构变量,并对boy1作了初始化赋值。在main函数中,把boy1的值整体赋予boy2, 然后用两个printf语句输出boy2各成员的值。

[例7.3]静态结构变量初始化。

main()
{
   static struct stu /*定义静态结构变量*/
   {
      int num;
      char *name;
      char sex;
      float score;
   }boy2,boy1={102,"Zhang ping",'M',78.5};
   boy2=boy1;
   printf("Number=%d\nName=%s\n",boy2.num,boy2.name);
   printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);
}
  本例是把boy1,boy2都定义为静态局部的结构变量, 同样可以作初始化赋值。
分享到:
评论

相关推荐

    C语言中struct和union有啥区别

    本文主要谈了C语言中struct和union的区别。

    c语言中的结构struct和联合union简介.doc.doc

    c语言中的结构struct和联合union简介

    C++大厂面试真题宝典 精选100道完结7章

    2、C语言中struct和union的区别 在存储多个成员信息时,编译器会自动给struct第一个成员分配存储空间,struct 可以存储多个成员信息,而union每个成员会用同一个存储空间,只能存储最后一个成员的信息。 都是由多个...

    Struct、union、enum

    学习C语言的结构体、联合、枚举、还有链表等的帮助学习文档 Learning C language structure body joint enumeration and chain table and help learning document。

    C语言 共用体(Union)详解及示例代码

    在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{  成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构体和共用体的...

    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 图形函数 字符屏幕函数

    C语言中的所有关键字

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

    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++ 结构体(struct)与共用体(union)

    结构体(struct)与共用体(union)是C语言中就已经存在的数据类型,C++对他们进行了扩充,最大的变化是允许在结构和公用体中定义成员函数。下面将通过实例讲解二者的特性和用法。 1.struct 以下是一个使用了结构体...

    谭浩强C语言对应C语言课程PPT.zip

    3.4 Struct 和 Union区别 4.枚举型(识记): 4.1 枚举型的定义 4.2 使用枚举型变量 5.typedef的用途(识记): 四.指针 1.指针与指针变量(识记): 2.指针运算符(领会): 3. 指针与函数 4.指针数组与指向...

    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语言深层探索+ARM linux移植

    C/C+语言struct深层探索 ...从两道经典试题谈C/C++中联合体(union)的使用 149 深入浅出Linux设备驱动编程 151 1.Linux内核模块 151 2.字符设备驱动程序 153 3.设备驱动中的并发控制 158 4.设备的阻塞与非阻塞操作 165

    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语言的语法大全.doc

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

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

    C语言编程宝典教程 (html),一个短小精悍的小技巧,分两部分,一部分是...指针、结构、联合和枚举 结 构(struct) 联 合(union) 枚 举(enum) 函数 Turbo C 程序设计初步 函数篇中,主要是列出C的函数,供查询参考。

    c语言入门教程.txt

    这些数据类型我们在本节和后面的章节中都会陆陆续续介绍。 那么变量我们总要给它取个名字吧,这个名字我们叫做标识符。 标识符的命名有一定的规则: (1).标识符只能由字母、数字和下划线三类字符组成 (2).第一个字符...

    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语言复习题目

    C) signed,union,scanf D) if,struct,type 【1.5】下列不属于C语言关键字的是 。 A) default B) register C) enum D) external 【1.6】C语言程序从main()函数开始执行,所以这个函数要写在____。 A) 程序文件...

    C语言编程宝典.exe

    C语言编程宝典 一,基础篇 1.1Turbo C语言概述 1.2 C 语言...指针、结构、联合和枚举 结 构(struct) 联 合(union) 枚 举(enum) 函数 Turbo C 程序设计初步 二,函数篇 屏幕函数 图形函数 (以下按字母顺序查询)

Global site tag (gtag.js) - Google Analytics