`

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` 都是用来创建复杂数据类型的构造数据类型。它们允许开发者将多个不同类型的变量组合在一起,以便更高效地管理和操作数据。尽管两者...

    struct和union结构体和联合体的区别.pdf

    - **Struct(结构体)**:在C语言中,`struct`是一种用户自定义的数据类型,它允许将不同类型的变量组合在一起,形成一个新的复合数据类型。结构体中的各个成员可以拥有不同的数据类型,并且每个成员都有其独立的...

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

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

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

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

    ch10-C-struct-union.rar_struct and union_union

    在C语言中,`struct` 和 `union` 是两种非常重要的数据类型,它们允许我们创建自定义的数据结构来存储和操作复杂的数据。本章节将详细探讨这两种数据类型的使用及其特点。 首先,`struct` 结构体是C语言中用于组合...

    C语言struct深层探索.doc

    在本文档《C语言struct深层探索》中,作者宋宝华深入探讨了`struct`在C/C++编程中的高级用法和技巧。 1. 结构体的作用 在大型C/C++程序中,`struct`被广泛用于组织和管理数据。通过结构体,可以将具有关联性的数据...

    Struct、union、enum

    通过本文的学习,我们可以了解到C语言中结构体、联合和枚举的基本概念及其使用方法。这些数据类型为我们提供了更加灵活的方式来组织和管理数据,使得程序的设计更为简洁高效。掌握这些基础知识对于进一步学习高级...

    C语言文法文档

    struct-or-union-specifier是C语言中的结构体或联合体说明符,包括struct和union。struct是C语言中的结构体,用于定义一个复杂的数据类型。union是C语言中的联合体,用于定义一个可以存储不同类型数据的变量。struct...

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

    【C语言、C++中的union用法总结】 在C和C++编程中,`union`是一种特殊的类型,它允许在相同内存位置存储不同类型的变量。理解`union`的关键在于了解其如何利用内存空间,以及如何在不同的数据类型之间切换。 **...

    c语言课件(完整版)

    C语言提供了多种基本数据类型,如整型(int)、浮点型(float、double)、字符型(char)等,以及构造类型如枚举(enum)、结构体(struct)、联合体(union)。了解这些数据类型及其用法,能帮助我们创建各种变量并...

    C语言中的所有关键字

    在C语言中,关键字是具有特殊含义的保留词汇,不能作为变量或函数的名字。这些关键字在编程中扮演着至关重要的角色,帮助我们定义数据类型、控制程序流程以及管理内存。下面我们将详细探讨C语言中的所有关键字及其...

    cHelp C语言中文帮助文档

    2. **类型系统**:C语言的类型系统是其语法基础,包括基本类型(如int、char、float、double)、复合类型(如struct、union)、指针类型等。文档会解释这些类型的特点和用法。 3. **预处理指令**:预处理器是C语言...

    C语言编程规范和范例

    2. **数据类型**:C语言提供了多种基本数据类型,如int、float、char等,以及复合类型如struct和union。理解这些数据类型的存储大小和精度是编程的基础。 3. **运算符和表达式**:包括算术运算符、比较运算符、逻辑...

    C语言考研试题和历年考试题

    - 变量与数据类型:理解各种基本数据类型如int、char、float、double,以及复合类型如struct和union。 - 运算符与表达式:掌握算术运算符、比较运算符、逻辑运算符、赋值运算符等,并理解运算符的优先级和结合性。...

    C语言精讲之深度解剖

    关键字是C语言中的保留字,有特定的含义,比如auto、register、static、sizeof、if、else、switch、case、do、while、for、goto、void、return、const、volatile、extern、struct、union、enum和typedef等。...

    C语言 C语言C语言C语言C语言C语言C

    2. **数据类型**(第3章):C语言有基本的数据类型,如整型(int)、字符型(char)、浮点型(float和double)等,还有自定义数据类型,如枚举(enum)、结构体(struct)和联合体(union)。数据类型的使用直接影响...

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

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

    C语言中的32个关键字

    - **复杂类型关键字**包括`struct`、`union`、`enum`、`typedef`和`sizeof`。 - **存储级别关键字**包括`auto`、`static`、`register`、`extern`、`const`和`volatile`。 #### 流程控制关键字 流程控制关键字用于...

Global site tag (gtag.js) - Google Analytics