vivo手机的网站开发,网站页面设计主要包括,网站内链结构是什么意思,建设pc端网站是什么意思✨✨欢迎#x1f44d;#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页#xff1a;秋邱博客 所属栏目#xff1a;C语言 #xff08;感谢您的光临#xff0c;您的光临蓬荜生辉#xff09; 前言
前面我们也涉及到了结构体的讲解#xff0c;但是只是粗略的讲了一下。 接下… ✨✨欢迎点赞☕️☕️收藏✍✍评论 个人主页秋邱博客 所属栏目C语言 感谢您的光临您的光临蓬荜生辉 前言
前面我们也涉及到了结构体的讲解但是只是粗略的讲了一下。 接下里详细讲解。
1.0 结构体声明
struct tag {member-listmember-listmember-list ...
} variable-list ;
结构体定义已经讲过了但是不够全面现在来重新看看用具体的例子来理解结构体的声明
struct num
{int num1;int num2;
}s1;///声明类型的同时定义变量是s1struct num s2;//定义结构体变量s2
struct num s3 { 3,4 };//顺序初始化//代码2
struct book
{char name[20];int num;
}b1 { {zhuangji},1001 };//顺序初始化struct book b2 { .name tangmu,.num 1002 };//指定顺序初始化//代码3
struct Node
{struct num;struct Node* next;
}n1 { {1,2},NULL };//结构体嵌套定义struct Node n2 { {5, 6}, NULL };//结构体嵌套初始化
以上初始化已经很详细了。
2.0 匿名结构体
什么是匿名结构体呢
匿名结构体就是省略类型标签tag只有成员变量没有成员名称。无结构体类型不能创建变量只能在空号外定义变量不能再创建变量。
struct//匿名结构体
{int a;char arr[20];
}Node {1,zhangsan};//匿名初始化
//}Node {.a1,lisi};匿名选择初始化
int main()
{printf(%d %s,Node.a,Node.arr);return 0;
}
这就是一个匿名结构体 以及它的初始化打印方式跟正常结构体相似。
注意
匿名的结构体类型如果没有对结构体类型重命名的话基本上只能使⽤⼀次。
3.0 自引用
struct Node
{int data;struct Node* next;//指针
}p;
这就是结构体自引用的表达式这是正确的表达式。
倘若将代码改成这样你认为合理吗
struct Node
{int data;struct Node next;
}p;
这其实是不对的。 因为⼀个结构体中再包含⼀个同类型的结构体变量这样结构体变量的⼤ ⼩就会⽆穷的⼤是不合理的。
4.0 内存对齐
我们知道了结构体的声明以及初始化和使用那么我们创建的结构体是多少字节呢这也是一个常考的知识点。
4.1 对齐规则 ⾸先得掌握结构体的对⻬规则 1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字对⻬数的整数倍的地址处。 对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。VS中默认的值为8Linux中gcc没有默认对齐数对对齐数就是成员自身的大小。 3. 结构体总⼤⼩为最⼤对⻬数结构体中每个成员变量都有⼀个对⻬数所有对⻬数中最⼤的的 整数倍。 4. 如果嵌套了结构体的情况嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处结构 体的整体⼤⼩就是所有最⼤对⻬数含嵌套结构体中成员的对⻬数的整数倍。 什么意思呢单看规则很难理解我们直接上代码。
4.2 练习1
struct S1
{char c1;int i;char c2;};
int main()
{printf(%zd\n, sizeof(struct S1));return 0;
}输出结果 12 那这个结果是怎么来的呢
4.2.1 分析 注意表中的一格代表一个字节。
偏移量第一个字节相对于起始位置偏移量是0第二个字节相对于起始位置偏移量是1。
假设我们从0开始存放char c1的变量大小为1,所以存放一个字节这时候的对齐数是1。int i占四个字节虽然vs默认值为8但是int类型更小这时候的对齐数是4既偏移量1,2,3都不是4的倍数所以int放在偏移量为4的位置char c2的大小是1偏移量8是一的倍数所以可以放。
你以为9就是struct S1的字节吗那你就错了我们还得对齐最大对齐数4。所以最后的结果就是12个字节。这样虽然会浪费空间但是也是有一定的好处我们之后再说。
4.3 练习2
struct S2
{char c1;char c2;int i;
};
int main()
{printf(%zd\n, sizeof(struct S1));return 0;
}
输出结果 8 4.3.1 分析 char c1 占1个字节char c2占1个自己且对齐数是1偏移量位1符合int i占对齐数是4偏移量位4刚刚好符合。都放完后字节需要是最大对齐数的整数倍所以就是8个字节。
4.4 练习3
struct S1
{char c1;int i;char c2;};
struct S3
{char c1;struct S1 s1;double d;
};
int main()
{printf(%zd\n, sizeof(struct S3));return 0;
}
4.3.1 分析 char c1占1一个字节struct S1 s1上面我们已经知道了占12个字节但为什么是偏移量为4的地方放呢这是因为结构体S3中有S1S1中的最大对齐位置取决于自己的最大对齐数而S1的最大对齐数是4所以从偏移量为4可以开始放s1double d占8个字节偏移量16刚刚好是8的倍数所struct S3中最大的对齐数是12而且字节刚刚好是24。
4.5 小结
S1和S2的变量成员是一样的但字节大小却是不同的所以我们再创建结构体变量的时候尽可能的将字节较小的类型集中在一起这样可以在一定程度上节省空间。
4.6 对齐数存在的意义
1. 平台原因(移植原因) 不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定 类型的数据否则抛出硬件异常。
2. 性能原因 数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于为了访问未对⻬的内存处理器需要 作两次内存访问⽽对⻬的内存访问仅需要⼀次访问。假设⼀个处理器总是从内存中取8个字节则地 址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数那么就可以 ⽤⼀个内存操作来读或者写值了。否则我们可能需要执⾏两次内存访问因为对象可能被分放在两 个8字节内存块中。
总体来说结构体的内存对⻬是拿空间来换取时间的做法。
4.7 修改默认对齐数
#pragma 这个预处理指令可以改变编译器的默认对⻬数。
我们直接看代码
#pragma pack(1)//设置默认对⻬数为1
struct S1
{char c1;int i;char c2;
};
#pragma pack()//取消设置的对⻬数还原为默认int main()
{printf(%zd\n, sizeof(struct S1));return 0;
}
原本打印的结果是12,但这这里改了。
输出结果 6 结构体在对⻬⽅式不合适的时候我们可以⾃⼰更改默认对⻬数。
5.0 结构体传参
通过上面的学习我们知道结构体所占字节一般都是很大的所以在函数应用过程中往往会采用传址传地址只需要4\8个字节不需要开辟那么大的空间传值浪费空间需要拷贝占的空空间是比较大的。
struct S1
{char c1;int i;char c2;
}p {.i10};
void test(struct S1*P)
{printf(%d, P-i);
}
int main()
{test(p);return 0;
}
如果是传值函数传参的时候参数是需要压栈会有时间和空间上的系统开销。如果传递⼀个结构体对象的时候结构体过⼤参数压栈的的系统开销⽐较⼤所以会导致性能的下降。
结论 结构体传参传结构体的地址。
6.0 结构体实现位段
5.1 定义
结构体位段bit field是一种数据结构在C语言中用于存储和操作内存中的位级数据。结构体位段允许程序员指定一个变量只占用指定位数的内存空间而不是整个字节或字。这种灵活性允许在一个字节或字中存储多个不同的位级信息从而节省内存空间。
5.2 位段声明
位段的声明和结构是类似的有两个不同
位段的成员必须是 int 、 unsigned int 或 signed int 在C99中位段成员的类型也可以 选择其他类型。位段的成员名后边有⼀个冒号和⼀个数字。
//位段式结构
struct A
{int _a : 2;//2个bit位int _b : 5;//5个bit位int _c : 10;//10个bit位int _d : 30;//30个bit位
};
int main()
{printf(%zd,sizeof(struct A));return 0;
} 有的同学可能会算251030 47bit位那么就是6个字节。是不是这样我们来看啊看结果
输出结果 8 为什么会是8呢这就与 位段内存分配有关了。
5.3 位段内存分配
位段的成员可以是 int、unsigned int、signed int或者char等类型。位段的空间上是按照需要以4个字节 signed int 或者是 char 等类型 int 或者1个字节 char 的⽅式来开辟的。位段涉及很多不确定因素位段是不跨平台的注重可移植的程序应该避免使⽤位段。
struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};
struct S s { 0 };
s.a 10;
s.b 12;
s.c 3;
s.d 4; 5.4 位段的跨平台问题
int 位段被当成有符号数还是⽆符号数是不确定的。位段中最⼤位的数⽬不能确定。16位机器最⼤1632位机器最⼤32写成27在16位机器会 出问题。位段中的成员在内存中从左向右分配还是从右向左分配标准尚未定义。当⼀个结构包含两个位段第⼆个位段成员⽐较⼤⽆法容纳于第⼀个位段剩余的位时是舍弃 剩余的位还是利⽤这是不确定的。
总结
跟结构相⽐位段可以达到同样的效果并且可以很好的节省空间但是有跨平台的问题存在
5.5 位段使⽤的注意事项
在使用结构体位段时需要注意以下几点 内存对齐位字段的大小通常由编译器自动选择为了满足对齐要求可能会在位字段之间插入额外的填充位。因此位字段的大小可能不等于字段成员所占的位数之和。开发者需要了解编译器对位字段进行内存对齐的规则以确保结构体的大小和内存布局符合预期。 位字段的类型位字段的类型可以是整型或枚举类型但不能是浮点型、指针类型等。这是因为浮点型和指针类型的大小是可变的无法确定应该占多少个位。 位字段的命名和长度位字段的命名要足够清晰明确以便其他开发者能够理解其含义。位字段的长度要根据具体需求进行选择过长的位字段可能会造成浪费而过短的位字段可能无法容纳所需要的数据。 位字段的操作位字段是以位为单位进行操作的因此在对位字段进行赋值和取值操作时需要使用位运算符来进行操作。开发者需要熟悉位运算符的使用方法以确保对位字段进行正确的操作。
总之使用结构体位段时需要了解内存对齐规则选择适当的位字段类型、命名和长度并使用正确的位运算符进行操作。这样才能正确地使用结构体位段并确保代码的可读性和可维护性。 文章转载自: http://www.morning.kqglp.cn.gov.cn.kqglp.cn http://www.morning.cbnxq.cn.gov.cn.cbnxq.cn http://www.morning.trmpj.cn.gov.cn.trmpj.cn http://www.morning.lhrcr.cn.gov.cn.lhrcr.cn http://www.morning.jtkfm.cn.gov.cn.jtkfm.cn http://www.morning.qsy39.cn.gov.cn.qsy39.cn http://www.morning.krkwh.cn.gov.cn.krkwh.cn http://www.morning.zyrcf.cn.gov.cn.zyrcf.cn http://www.morning.tzzxs.cn.gov.cn.tzzxs.cn http://www.morning.xxknq.cn.gov.cn.xxknq.cn http://www.morning.zbpqq.cn.gov.cn.zbpqq.cn http://www.morning.jfnbh.cn.gov.cn.jfnbh.cn http://www.morning.lsbjj.cn.gov.cn.lsbjj.cn http://www.morning.sjwqr.cn.gov.cn.sjwqr.cn http://www.morning.mcpby.cn.gov.cn.mcpby.cn http://www.morning.ldcrh.cn.gov.cn.ldcrh.cn http://www.morning.hgtr.cn.gov.cn.hgtr.cn http://www.morning.jtqxs.cn.gov.cn.jtqxs.cn http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com http://www.morning.npxcc.cn.gov.cn.npxcc.cn http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn http://www.morning.sqxr.cn.gov.cn.sqxr.cn http://www.morning.zzaxr.cn.gov.cn.zzaxr.cn http://www.morning.khlxd.cn.gov.cn.khlxd.cn http://www.morning.mkrjf.cn.gov.cn.mkrjf.cn http://www.morning.sgpnz.cn.gov.cn.sgpnz.cn http://www.morning.mkyxp.cn.gov.cn.mkyxp.cn http://www.morning.lmhcy.cn.gov.cn.lmhcy.cn http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn http://www.morning.rfqkx.cn.gov.cn.rfqkx.cn http://www.morning.plfrk.cn.gov.cn.plfrk.cn http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn http://www.morning.skmpj.cn.gov.cn.skmpj.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.stsnf.cn.gov.cn.stsnf.cn http://www.morning.llllcc.com.gov.cn.llllcc.com http://www.morning.hmlpn.cn.gov.cn.hmlpn.cn http://www.morning.blbys.cn.gov.cn.blbys.cn http://www.morning.wslr.cn.gov.cn.wslr.cn http://www.morning.kwpnx.cn.gov.cn.kwpnx.cn http://www.morning.rrbhy.cn.gov.cn.rrbhy.cn http://www.morning.grpfj.cn.gov.cn.grpfj.cn http://www.morning.dwfzm.cn.gov.cn.dwfzm.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.lxfqc.cn.gov.cn.lxfqc.cn http://www.morning.wgcng.cn.gov.cn.wgcng.cn http://www.morning.gwjsm.cn.gov.cn.gwjsm.cn http://www.morning.yrjfb.cn.gov.cn.yrjfb.cn http://www.morning.sbrxm.cn.gov.cn.sbrxm.cn http://www.morning.wqfzx.cn.gov.cn.wqfzx.cn http://www.morning.gqflj.cn.gov.cn.gqflj.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.lzdbb.cn.gov.cn.lzdbb.cn http://www.morning.grfhd.cn.gov.cn.grfhd.cn http://www.morning.dpbdq.cn.gov.cn.dpbdq.cn http://www.morning.ndpzm.cn.gov.cn.ndpzm.cn http://www.morning.rshkh.cn.gov.cn.rshkh.cn http://www.morning.dmtld.cn.gov.cn.dmtld.cn http://www.morning.gllhx.cn.gov.cn.gllhx.cn http://www.morning.krzrg.cn.gov.cn.krzrg.cn http://www.morning.bphqd.cn.gov.cn.bphqd.cn http://www.morning.fgtls.cn.gov.cn.fgtls.cn http://www.morning.xrpjr.cn.gov.cn.xrpjr.cn http://www.morning.btgxf.cn.gov.cn.btgxf.cn http://www.morning.mlckd.cn.gov.cn.mlckd.cn http://www.morning.elmtw.cn.gov.cn.elmtw.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn http://www.morning.jjnql.cn.gov.cn.jjnql.cn http://www.morning.rpstb.cn.gov.cn.rpstb.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.qjdqj.cn.gov.cn.qjdqj.cn http://www.morning.amonr.com.gov.cn.amonr.com http://www.morning.dbphz.cn.gov.cn.dbphz.cn http://www.morning.rnzbr.cn.gov.cn.rnzbr.cn http://www.morning.mingjiangds.com.gov.cn.mingjiangds.com http://www.morning.yszrk.cn.gov.cn.yszrk.cn http://www.morning.fglyb.cn.gov.cn.fglyb.cn http://www.morning.mmqhq.cn.gov.cn.mmqhq.cn http://www.morning.sxjmz.cn.gov.cn.sxjmz.cn