zoukankan      html  css  js  c++  java
  • 【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[=整型常数]};

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

      

      

  • 相关阅读:
    初学Google Code,Subversion和TortoiseSVN
    成长,真有你想象的那样迫切?
    Java中十个常见的违规编码
    Eclipse打包工具Fatjar
    “旁观者效应”是如何毁掉我们的代码的
    java设计模式—分类
    java中的关键字static(静态变量)和final定义常量
    JAVA UDP打洞必备知识点NAT
    [Struts]在jsp里处理比较复杂的内容?
    反向链接referrer的原理
  • 原文地址:https://www.cnblogs.com/bossren/p/6422226.html
Copyright © 2011-2022 走看看