【C语言篇】☞ 15. 结构体、联合体、枚举

结构体

1. 概念

  结构体:自定义数据类型。 

  结构体变量是由多个其他变量组成的复合变量。多个变量的类型可以不同,而且每一个变量都有自己的名字。

  

2. 结构体定义

  • 一般的定义方式:

  

  • 常用的定义方式:

  

3. 结构体变量的初始化

  

4. 赋值(逐个赋值)  

    

  结构体成员变量的访问有两种形式:一种是用符号"."(通用),一种是用符号"->"(一般是结构体指针变量用)。

5. 结构体所占内存空间

  关于结构体内存对齐规则: #pragma pack(n) 这个宏表示设置为n字节对齐(VC6默认8字节对齐)

  • 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(n, 该成员的大小)的倍数。(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
  • 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,总大小必须是min(n, 最大成员的大小)的倍数,不足的要补齐。
  • 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 

   首先明确一点:结构体中的成员是从低地址向高地址排列的,这一点和数组类似,即排在结构体前面的成员占用内存低地址,排在结构体后面的成员占用内存高地址。

   

   

   

   

6. 构造类型: 数组/ 结构体

  • 数组: 是用于保存一组相同类型的数据
  • 结构体: 是用于保存一组不同类型的数据

联合体 union

1. 概念

  union,中文名“联合体、共用体”。联合体的用法、语法和结构体非常相似。

  • 联合体所占用的内存空间大小等于最长的成员所占用的字节数。
  • 联合中所有的成员都共享同一片内存空间。(联合体使用了覆盖技术,几个成员变量相互覆盖,从而使几个不同变量共占同一段内存
  • 联合体只能存放一个成员变量的值。对新的成员变量赋值,就会把原来成员变量的值覆盖掉
  • 联合体union的存放顺序是所有成员都从低地址开始存放的。

2. 定义

  联合语法格式:(与结构体一样)

  

  //共用体 data 中,成员 i 所占用的空间最大,为 4 个字节,所以 data 类型的变量(也就是a、b、c)也占用4个字节的内存。

    

  • 对某一个成员赋值,会覆盖其他成员的值(因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节)

   

  • 为什么要引入联合体:

结构体内存空间的分配是粗放的,不管用不用,全分配;联合体内存使用更为精细灵活,节省内存空间。

枚举

定义:

  C语言提供了一种枚举(enum)类型,可以列出所有可能的取值。定义形式为:

    enum 枚举名{ 标识符1[=整型常数], 标识符2[=整型常数], ... 标识符n[=整型常数]};

    注意:枚举值是标识符,要注意命名格式!

  

  

 

posted @ 2017-02-20 00:18  专注·精彩  阅读(731)  评论(0编辑  收藏  举报