结构体、位段以及联合的计算——自定义类型部分知识

一 自定义类型部分知识


1**——结构体类型创建**
(1)介绍——struct在C语言中是一个关键字,用于定义结构数据类型;“结构”是一种构造数据类型,现在一般叫做用户自定义数据类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。
(2)格式——语法格式:
struct 新类型名称
{
数据类型1 变量名称1;
数据类型2 变量名称2;
数据类型3 变量名称3;
}
(3)例子

struct student 
{
    char name[20];
    int age;   
    float score;  
    char sex[5];     
};

2 结构体初始化
——初始化的4种方式

1)定义的同时初始化(结构体嵌套初始化)  
    struct Student s = {"zhangsan",20,85,"nan"};  2)先定义再逐个初始化  
    struct Student s;  
    s.name = "zhangsan";  
    s.age = 20;  
    s.score =85;
    s.sex = "nan";  3)先定义再一次性初始化  
    struct Student s;  
    s = (struct Student){"zhangsan",20,85,"nan"};

    注意:结构体和数组在这里的区别,数组不能先定义再进行一次性初始化  
    结构体要明确的告诉系统{}中是一个结构体  

(4)指定将数据赋值给指定的属性  
     struct Student s = {.name = "zhangsan",.age = 20,.score = 85,.sex = "nan"};  

3 结构体内存对齐
——结构体的对齐规则:
(1)第一个成员在与结构体变量偏移量为0的地址处;
(2)其他成员变量要对其到某个数字(对齐数)的整数倍的地址处;
* 对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。
提示:VS中默认的为8,Linux中的默认值为4;
(3)结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍;
(4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整数大小就 是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
——为什么存在内存对齐?
(1)平台原因;(2)性能原因。
举例:

二 位段

(1)位段——注意:位段也是一种结构体;为了省空间;不跨平台。
——位段的成员必须是 int、unsigned int或signed int
——位段的成员名后边有一个冒号和一个数字。
(2)计算

struct A
{
   int _a:2;
   int _b:5;
   int _c:10;
   int _d:30;
};

struct S
{
   char a:3;
   char b:4;
   char c:5;
   char d:4;
};


(3)位段内存的分配
@ 位段的成员可以是int 、unsigned int 、signed int或者是char(属于整形家族)类型;
@ 位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的;
@ 位段涉及很多不确定因素,位段是不跨平台的,注意可移植的程序应该避免使用位段。

三 枚举 联合

1——枚举
(1)枚举就是一一列举的意思
(2)枚举类型的定义:

`enum Day
{
      Mon,
      Tues,
      Wed,
      Thur,
      Fri,
      Sat,
      Sun,
};

`注意:{}中的内容就是枚举类型的可能取值,也叫枚举常量;这些可能取值都是有值的,默认从0开始,一次递增1,定义时也可赋值。
(3)枚举的优点:
@ 增加代码的可读性和可维护性;
@ 跟#define定义的标识符比较枚举有类型检查,更加严谨;
@ 防止了命名污染(封装);
@ 便于调试;
@ 使用方便,一次可以定义多个常量。
2——联合(共用体)
(1)联合:也是一种特殊的自定义类型,也包含一系列的成员,特征是这些成员公用同一块空间。“

例如:union un
      {
         char c;
         int i;
      };

大小为4 公用同一块空间。
(2)计算

联合的大小至少是最大成员的大小;
当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。
      union un
      {
         char c;
         int i;
      };

这里写图片描述

猜你喜欢

转载自blog.csdn.net/paranoid_cc/article/details/79490254