结构体
结构体声明
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个原则:
- 第一个成员在结构体偏移量为0的地址处
- 其他成员要对齐到偏移量为对齐数整数倍的地址处。
- 结构体的大小为最大对齐数的整数倍。
- 嵌套的结构体要对齐到结构体最大对齐数的整数倍。
可以通过#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)开辟的。
位段的跨平台问题:
成员在内存中从左往右分配、还是从右往左分配标准未定义。
第二个位段成员,无法容纳上一个位段剩余的位置时,是舍弃剩余位还是利用,是不确定的。
位段内存对齐:
结构体位段,数据成员类型相同,第一个成员已对齐,所以其余也对齐了。
本文详细介绍了C/C++中的结构体,包括结构体声明、结构体访问、结构体自引用以及内存对齐的概念和规则。同时,讨论了结构体内存对齐的四个基本原则,并提到了#pragma pack指令用于调整对齐数。此外,还探讨了结构体实现位段的特性,如位段成员的数据类型限制以及位段跨平台的不确定性。

3万+

被折叠的 条评论
为什么被折叠?



