个人对结构体的一点理解

结构体:
是由一系列具有相同类型或不同类型的数据构成的数据集合.
结构体声明:
struct:结构体关键字
tag:结构体的标志
member_list:结构体的成员列表
variable_list:结构体声明的变量`

struct tag{
member_list
} variable_list;

一般情况下,在声明结构体的时候,要保证至少声明tag、member_list和variable_list中的两个.

//结构体被命名为Student
struct Student {  //Student为结构体的标志
int name[1024];  //成员变量
int age;  //成员变量
} ;  //没有声明变量
struct Student student1;  //声明一个结构体变量

//匿名结构体类型(没有结构体标志)
struct {  //无结构体标志
char name[1024];  //成员变量
int age;  //成员变量
 } student;  //声明一个变量student

//利用typedef定义一个结构体类型名
typedef struct {  
char name[1024];  //成员变量
int age;  //成员变量
} Student;  //Student是一个结构体类型
Student student1;  //student是一个Student型的结构体

结构体初始化(以上述Student类型为例)

Student student1 = {“张三”,23};

注意:结构体只能用{}初始化,不能用{}赋值.
若要给其赋值,可用strcpy函数:

Strcpy(student1.name,”李四”);  //给字符型变量赋值
student1.age = 22;  //给int型变量赋值

结构体的自引用:
即结构体通过指针引用自身的情况.

struct Node{
int data;  //成员变量
struct Node* next;  //结构体指针
} ;

这种方法多用于数据结构中的链表和二叉树.

结构体内存对齐:
这是一种拿空间换时间人的做法.
结构体对齐的规则为:
1.第一个成员在与结构体变量偏移量为0的地址处;
2.其他成员变量要对齐到对齐数的整数倍的地址处;
对齐数:编译器默认对齐数与该成员变量大小中的较小值.
*在VS中默认对齐数为8;
*在Linux中没有默认对齐数.
3.结构体的总大小为最大对齐数(在成员变量中找)的整数倍;
4.如果结构体嵌套了结构体,那么嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的总大小就是所有最大对齐数(含嵌套的结构体的最大对齐数)的整数倍.

设结构体变量的地址为0x00000000
struct s1{
char c1;  //对齐数为1 地址为0x00000000
int i;  //对齐数为4  地址为0x00000004
char c2;  //对齐数为1  地址为0x00000009
};
printf(“%d\n”,sizeof(struct s1));  //输出为12 (最大对齐数的整数倍)

struct s2{
char c1;  //对齐数为1  地址为0x00000000
char c2;  //对齐数为1  地址为0x00000002
int i;  //对齐数为4  地址为0x00000004 
};
printf(“%d\n”,sizeof(struct s2));  //输出8(最大对齐数的整数倍)
另外用 # pragma pack() 可以修改默认对齐数,如:
# pragma pack(8)  //修改默认对齐数为8
# pragma pack()  //恢复默认对齐数

位段
位段的声明和结构体类似,不同的是:
1.位段的成员必须是int, unsigned int和signed int,也可以是char(属于整型家族)型;
2.位段的成员名后有一个冒号和一个数字.

struct A{
char a:3;
char b:4;
char c:5;
char d:4;
};
struct A s = {0};
s.a = 10;
s.b =12;
s.c =3;
s.d =4;

在这里插入图片描述
在这里插入图片描述

和结构体相比位段可以达到同样的效果,而且可以很好的节省空间,但有跨平台的问题,因此注重可移植的程序应该避免使用位段.

枚举:
指把可能的值一一列举.
枚举类型的枚举常量必须可以一一列举.
枚举类型的定义

Enum Day{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
};

枚举常量的值从0开始,逐个加1,也可以在定义时直接赋初值.
枚举的优点:
1.增加代码的可读性和可维护性;
2.和#define定义的标识符比较枚举有类型检测,更加严谨;
3.防止命名污染;
4.便于调试
5.使用方便,可以一次定义多个常量.

共用体
共用体又叫联合,也是一种特殊的自定义的类型,这种变量包含一系列的成员,其特征是这些成员公用同一块空间.
共用体的声明

union Un{  //U为共用体的类型名
char c;  //共用体的成员
int i;  //共用体的成员
};
union Un n;  //定义共用体变量
printf(“%d\n”,sizeof(n));  //计算共用体变量的大小(输出4)

共用体大小的计算:
1.共用体的大小至少是最大成员的大小.
2.当最大成员的大小不是最大对齐数的整数倍时,对齐到最大对齐数的整数倍.
如:

union Un1{
char c [5];  //对齐数为1  5个char型数据占5个字节
int i;  //对齐数为4    1个int型数据占4个字节
};
printf(“%d\n”,sizeof(union Un1));  //输出8

unoin Un2{
char c[7];  //对齐数为1  7个char型数据占7个字节
int i;  //对齐数为4  1个int型数据占4个字节
};
printf(“%d\n”,sizeof(union U
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值