结构体、位段以及联合的计算——自定义类型部分知识
2018-03-08 21:23
507 查看
一 自定义类型部分知识
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; };
相关文章推荐
- 自定义类型:结构体,枚举,联合部分知识总结
- 自定义类型部分知识写一篇博客。 知识点: >结构体类型创建 >结构体初始化 >结构体内存对齐 >位段,位段计算机大小。 >枚举+联合。
- 自定义类型(结构体、位段、枚举和联合)
- 自定义类型(结构体,位段,枚举,联合)总结
- 自定义类型(结构体、枚举、联合)以及内存对齐问题
- 自定义类型:结构体 位段 枚举 联合
- 自定义类型(结构体,枚举,联合,位段)
- 【C语言基础】关于结构体,枚举,联合,位段的一些知识
- 自定义类型部分知识
- 自定义类型——结构体、枚举、联合
- 结构体,联合的位域定义方法,以及结构体大小的计算
- 自定义类型:结构体、枚举、联合
- 自定义类型:结构体,枚举,联合
- 自定义类型——结构体,枚举,联合
- C++ STL 有关于SET集合部分 的自定义数据类型的排序 以及 pair的使用
- 结构体相关的计算(结构体指针加一以及强制类型转换后加一)
- 结构体,结构体内存对齐,位段,枚举,联合知识总结
- 一些基本知识(一)(结构体,共用体,自定义类型,::,指针)
- 自定义类型:结构体,枚举,联合
- 自定义类型:结构体、枚举、联合