您的位置:首页 > 其它

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

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;
};




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息