免费行情网站app斗印,家装设计学习,网站如何做seo的,效果好网站建设哪家好和黛玉学编程呀#xff0c;大家一起努力呀............. 结构体类型的声明 回顾一下
struct tag
{
member-list;
}variable-list; 创建和初始化
我们知道#xff0c;在C语言中#xff0c;对于一些数据是必须初始化的#xff0c;但是结构体怎么创建并且初始化呢#xff1…和黛玉学编程呀大家一起努力呀............. 结构体类型的声明 回顾一下
struct tag
{
member-list;
}variable-list; 创建和初始化
我们知道在C语言中对于一些数据是必须初始化的但是结构体怎么创建并且初始化呢很简单直接赋值上就好了 #include stdio.h
struct Stu
{
char name[20]; //名字
int age; //年龄
char sex[5]; //性别
char id[20]; //学号
};
int main()
{
//按照结构体成员的顺序初始化
struct Stu s { 张三, 20, 男, 20230818001 };
printf(name: %s\n, s.name);
printf(age : %d\n, s.age);
printf(sex : %s\n, s.sex);
printf(id : %s\n, s.id);
//按照指定的顺序初始化
struct Stu s2 { .age 18, .name lisi, .id 20230818002, .sex ⼥
printf(name: %s\n, s2.name);
printf(age : %d\n, s2.age);
printf(sex : %s\n, s2.sex);
printf(id : %s\n, s2.id);
return 0;
}
结构体的特殊声明
在声明结构体的时候可以不完全声明也就是在struct后面不写东西比如上面的把Stu去掉
结构体的自引用 递归里面我们知道它用到了自己那结构体可以包含一个类型为该结构本身的成员吗
来看一下吧
struct Node
{int data;struct Node* next;
};
结构体的内存对齐 对齐规则 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字对⻬数的整数倍的地址处 对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。VS 中默认的值为 8 Linux中gcc没有默认对⻬数对⻬数就是成员⾃⾝的⼤⼩ 3.结构体总⼤⼩为最⼤对⻬数结构体中每个成员变量都有⼀个对⻬数所有对⻬数中最⼤的的整数倍。 4.如果嵌套了结构体的情况嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处结构体的整体⼤⼩就是所有最⼤对⻬数含嵌套结构体中成员的对⻬数的整数倍 看那么多不如找代码来练习一下就知道啦 1.
struct S1
{
char c1;
int i;
char c2;
};
printf(%d\n, sizeof(struct S1)); 在vs上默认值是8 对于C1,从0开始然后对于i它对齐数是4 对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。 然后就从4开始对齐他是int类型占4个字节占到7 对于C2,对齐数是1占到8这个时候大小为9从0到8也就是9个格子啦这是可能会判断错的所以最好画图解决 但是由于对齐规则结构体总⼤⼩为最⼤对⻬数结构体中每个成员变量都有⼀个对⻬数所有对⻬数中最⼤的的整数倍。在这个结构体最大对齐数为4整数倍并且比9大的也就是12啦 如果我把结构体里面的内容换一个位置呢结果又会怎么样呢
看代码
struct S2
{
char c1;
char c2;
int i;
};
printf(%d\n, sizeof(struct S2)); 我们再画图c1从0 开始c2的对齐数是1从开始的一个字节然后i的对齐数是4从4开始4个字节到7为止现在大小是8刚好是最大对齐数的整数倍所以答案就是8 为什么要内存对齐呢
首先 不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常
然后数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于为了访问未对⻬的内存处理器需要作两次内存访问
总之有那么一个说法结构体对齐就是拿空间换取时间的做法 在设计结构体的时候我们为了节省空间又满足对齐规则所以尽量把占空间小的成员集中在一起上面的两个例子已经可以说明啦 修改默认对齐数
上面说到在vs上默认对齐数是8但是我不想对齐数是8应该怎么修改呢#pragma 这个预处理指令可以改变编译器的默认对⻬数。
#include stdio.h
#pragma pack(1) //设置默认对⻬数为1
struct S
{
char c1;
int i;
char c2;
};
#pragma pack() //取消设置的对⻬数还原为默认
int main()
{
printf(%d\n, sizeof(struct S));
return 0;
} 注意结构体传参的时候最好传的是地址也就是需要使用到指针
结构体实现位段
什么是位段
1. 位段的成员必须是 int、unsigned int 或signed int 在C99中位段成员的类型也可以 选择其他类型。 2. 位段的成员名后边有⼀个冒号和⼀个数字。
这个位段是为了节省空间
struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
}; 这个时候A就是一个位段类型 这个2,5,10,34是比特的意思加起来是47比特 然后8是两个整型可以放下47比特 位段的内存分配? 1. 位段的成员可以是 int unsigned int signed int 或者是 char 等类型? 2. 位段的空间上是按照需要以4个字节 int 或者1个字节 char 的⽅式来开辟的。 3. 位段涉及很多不确定因素位段是不跨平台的注重可移植的程序应该避免使⽤位段。 跟结构相⽐位段可以达到同样的效果并且可以很好的节省空间但是有跨平台的问题存在 位段使⽤的注意事项 位段的⼏个成员共有同⼀个字节这样有些成员的起始位置并不是某个字节的起始位置那么这些位 置处是没有地址的。内存中每个字节分配⼀个地址⼀个字节内部的bit位是没有地址的。? 所以不能对位段的成员使⽤操作符这样就不能使⽤scanf直接给位段的成员输⼊值只能是先输⼊ 放在⼀个变量中然后赋值给位段的成员。 然后就到这里啦你能看到这里你已经很厉害啦希望这些知识对你有所帮助啦干完C语言然后我们就需要学习数据结构啦这篇也算是数据结构里面的内容哦