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[=整型常数]};

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

      

      

  • 相关阅读:
    编译gcc报错make[3]: Leaving directory `/usr/local/src/gcc-7.4.0/build/gcc' make[2]: *** [all-stage1-gcc] Error 2 处理
    ERROR 1176 (42000): Key 'XXX' doesn't exist in table 'XXX'报错处理
    /lib64/libc.so.6: version `GLIBC_2.18' not found报错解决
    Centos7上pkg-config的安装
    ERROR: Error in Log_event::read_log_event(): 'Found invalid event in binary log', data_len: 31, event_type: 35报错处理
    MySQL5.7主从复制slave报Last_Errno: 1146错误解决
    详述 hosts 文件的作用及修改 hosts 文件的方法
    Java Decompiler(Java反编译工具)
    使用Charles代理工具导致电脑无法正常访问网站(您的连接不是私密连接)
    阿里云服务器Svn-Server无法连接,阿里云服务器SVNServer配置
  • 原文地址:https://www.cnblogs.com/bossren/p/6422226.html
Copyright © 2011-2022 走看看