结构体详解

本文详细介绍了C/C++中的结构体,包括结构体声明、结构体访问、结构体自引用以及内存对齐的概念和规则。同时,讨论了结构体内存对齐的四个基本原则,并提到了#pragma pack指令用于调整对齐数。此外,还探讨了结构体实现位段的特性,如位段成员的数据类型限制以及位段跨平台的不确定性。

结构体

结构体声明
struct tag //结构体名称可以省略,但建议不要省略
{
 /*数据成员*/
}s,*p/*可以在声明的同时定义变量*/

举个例子

struct
{   
    int i;
    char c;
}x;
struct
{
    int i;
    char c;
}*p,s;

注意:这里是匿名结构体,编译器把二者看作完全不同的类型

结构体访问

结构体访问操作符:点操作符(.)、(->)操作符。

struct Stu
{
    int age;
    char name[20];
}*p,s;

/*成员访问*/
s.name  = "李四";
s.age = 20;
/*指针访问*/
(*p).name = "张三";
(*p).age = 18;
结构体自引用

结构体自引用要通过指针引用。

/*正确引用*/
struct S
{
    int i;
    struct S *p;
}
/*错误引用*/
struct S
{
    int i;
    struct S s1;
}
结构体内存对齐

先了解一个概念:对齐数
对齐数 = 编译器默认的对齐数于该成员中的最小值。VS 默认值 4,LINUX 默认值 为8.

内存对齐的4个原则:

  1. 第一个成员在结构体偏移量为0的地址处
  2. 其他成员要对齐到偏移量为对齐数整数倍的地址处。
  3. 结构体的大小为最大对齐数的整数倍。
  4. 嵌套的结构体要对齐到结构体最大对齐数的整数倍。

可以通过#pragma pack(num) 更改默认对齐数(num = 1,2,4,8,16任意一个),当更改的大于编译器默认的时候,默认对齐数不改变。

结构体实现位段

举个例子

/*位段*/
struct A
{
    int  a:2;
    int  b:5;
    int  c:10;
    int  d:30;
}

位段成员必须是 int 、unsigned int 、signed int 、char.
位段分配内存空间如下:这里写图片描述
位段空间开辟:是以4个字节(int)、1个字节(char)开辟的。
位段的跨平台问题:
成员在内存中从左往右分配、还是从右往左分配标准未定义。
第二个位段成员,无法容纳上一个位段剩余的位置时,是舍弃剩余位还是利用,是不确定的。
位段内存对齐:
结构体位段,数据成员类型相同,第一个成员已对齐,所以其余也对齐了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值