正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。...(8位),意味着位域的值<=8 举例说明 #include struct Node { unsigned char a:3; char b:2; unsigned char c:...//天数1...31 5bit就足够 unsigned int month:4; //月份1...12 四bit就足够 unsigned int year:23; //四字节剩余给年份 }; 结构图如下...: 字节大小 注意:在使用位域的结构体后,不能使用结构体中的元素类型的指针来访问结构体元素的地址; 看清区别,理解本质 struct Node { unsigned char a:3; char...c:3; //存放在下一个字节 }; 只要是结构体,就要遵循内存对齐 不管结构体中是否使用位域,都要进行内存对齐; struct Node { unsigned char a:3; int b:
目录 前言 结构体struct 结构体的声明 结构的自引用 结构体变量的定义和初始化 空结构体大小 结构体内存对齐 修改默认对齐数 宏offsetof 结构体传参 柔性数组 struct与class的区别.../输出结果:12 解释: 第一个成员c1在与结构体变量偏移量为0的地址处 对于c2它的对齐数为4(int大小为4,小于平台默认值8),该变量要对齐到偏移量为4的倍数处,即从偏移量为4的位置开始存放...c1在与结构体变量偏移量为0的地址处 c2放在偏移量为1的地址处 i放在偏移量为4的地址处(对齐到偏移量为对齐数4的倍数处) 示例3: struct S3 { double d; char c;...int i; }; printf("%d\n", sizeof(struct S3)); //输出结果:16 解释: 第一个成员d在与结构体变量偏移量为0的地址处 c放在偏移量为8的地址处 i放在偏移量为...(struct S4)); //输出结果:48 解释: 第一个成员c1在与结构体变量偏移量为0的地址处 s3放在偏移量为8的地址处(s3最大对齐数为8) d放在偏移量为24的地址处(对齐到偏移量为对齐数
C语言允许在结构体中以位为单位设置成员所占的内存空间。以位为单位的成员,简称为位域或位段(Bit field)。 其优点是较少的位数存储数据从而节省空间,还可以进行内存对齐。...节省空间 例如下列结构体内的变量使用了位域,占用空间只有1字节(8bit)。相对于不使用位域的缩少了3字节(24bit)的数据。
✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 感谢您的点赞与关注,同时欢迎各位有空来访我的平凡舍 --...-- 文章目录 @[toc] ✍前言 指针 什么是指针 指针类型与指针解引用 野指针 指针运算 指针和数组 二级指针 指针数组 结构体 结构体的声明与成员的类型 结构体变量的定义和初始化及访问 结构体传参...结语 ✍前言 指针和结构体这两块内容是非常重要的,可以说是C语言的重点内容了,同时,如果学习C语言版的数据结构,我们可以知道,基本所有的数据结构都是建立在结构体之上的,以及相关操作也要用到指针,指针和结构体也是...C语言的特点,对于一些面向对象的语言来说,如java就没有指针和结构体这种说法存在了。...结构体的声明与成员的类型 结构体的声明 struct tag { member-list; }variable-list; //例如一个学生 //typedef:重命名 typedef struct
如果结构体中没有成员,结构体的空间大小为0. 【2】结构体变量 1.概念:用结构体类型定义的变量称之为结构体变量。...2.定义格式: 1)定义结构体的同时定义结构体变量。...1)先定义结构体,再对结构体类型进行重定义。...【3】结构体数组 1.概念:存放结构体变量的数组称之为结构体数组。...结构体类型大小 * 数组元素个数 【4】结构体指针 1.概念:指向结构体变量的指针称之为结构体指针。
结构体介绍 C语言里的结构体是可以包含不同数据类型和相同数据类型的一个有序集合,属于构造类型,可以自己任意组合,并且结构体里也可以使用结构体类型作为成员。...—遵循C语言变量命名标准。...//年龄 char name[100]; //姓名 int number; //学号 }c1,c2,c3; //c1 c2 c3就是定义的结构体变量 int main() {...结构体指针定义与使用 示例代码: #include #include #include struct app { int age...结构体位域 位域用的不多,但是也有地方使用,主要是节省空间。
一、分支结构 分支结构允许程序根据条件的不同执行不同的代码块。C语言中,最常用的分支结构是if语句和 1. if语句 if语句是最基本的条件判断语句,它根据表达式的真假来决定是否执行特定的代码块。...C语言中,常用的循环结构有for循环、while循环和do-while循环。 1. for循环 for循环是最常用的循环结构之一,它通常用于已知循环次数的场景。...分支与循环结构可以相互嵌套,形成更复杂的逻辑流程。...嵌套结构的使用极大地增强了程序的灵活性和表达能力。 结语 分支与循环结构是C语言编程的基础,它们构建了程序的核心逻辑流程。通过深入理解这些结构,读者可以编写出更加高效、灵活和强大的程序。...希望本文的讲解能够帮助读者更好地掌握C语言中的分支与循环结构,为未来的编程之路打下坚实的基础。
选择结构 if else 选择结构 1. else 只与上面离它最近的一个 if 配对。 2. C语言中,编译器忽略缩进,所以 if else 配对不看缩进。...if else 基本结构: #define _CRT_SECURE_NO_WARNINGS #include int main() { int i = 0; scanf("%d"...%d 岁\n",i); } else { printf("你还未成年\n"); printf("今年你 %d 岁\n", i); } return 0; } if else 双层嵌套结构... switch case 基本结构: switch (expression) { case value1: statement case value2: statement...期待与您的交流,让我们共同成长,探索技术世界的无限可能!
C语言结构体与结构体指针的使用 tips:最近要好好学习一下数据结构,所以必不可少的就是c语言的结构体和结构体指针了,所以就整理一下这些基础知识 c语言结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合...c语言是一门面向过程的编程语言,而结构体的使用在某些层次上跟面向对象有点异曲同工之处了。下面回归正题,学习一下结构体以及结构体指针的知识。...%c",&st3.num,st3.name,&st3.sex);//对于数组,scanf输入的时候不用"&" 123 结构的变量的访问(输出) printf("%d,%s,%c\n", st1...s %c\n",p->num,p->name,p->sex); 1234 //指针访问 struct student *p;//定义结构体指针 p=&st1; printf("%d %s %...---- 附:c语言常见运算符优先级 优先级 运算符 含义 结合方向 1 [] 数组下标 从左向右 () 圆括号 .
,由规则(1)可得如下; 橙色填充为结构体成员b,因其为int类型(4个字节)且不是第一个成员,由规则(2)可得如下; 绿色填充为结构体成员c,因其为char类型且不是第一个成员,由规则(2)(3)可得如下...a,因其为char类型且是第一个成员,由规则(1)可得如下; 橙色填充为结构体成员b,因其为char类型且不是第一个成员,由规则(2)可得如下; 绿色填充为结构体成员c,因其为int类型且不是第一个成员...,大小为16,由规则(4)可得如下图; 绿色填充为结构体成员c,因其为int类型且不是第一个成员,由规则(2)(3)可得如下; 画红叉内存位置属于因对齐造成的浪费内存。...共用体与结构体 共用体 #include #include union stu{ char a; short b; int c; };...2.只给a赋值,但是输出c时输出了a的内容。 分析:内存中用左图来表示结构体,右图表示共用体。结构体的成员在内存中都有各自的空间,而共用体中共用同一块内存。
于是C语言就定义了一个不同类型数据的集合的数据结构 ————结构体。...准确来说,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。...4.typedef 与结构体 struct + 结构体名称这种写法有时候会不会太过冗长了呢,C语言提供了一个很好的解决这种冗长代码的关键字 ,typedef 关键字可以将类型进行重命名...在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。...这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。
结构体 结构体是用户建立由不同类型数据组成的混合型的数据结构(数据类型)。 系统提供的类型:int double float char long 数组,指针......一般形式: struct 结构体名{ 成员; }; 例如:定义一个学生的结构体,学生包括姓名,性别,年龄。声明一个学生的变量,输出学生的信息。...Student stu,stu2; strcpy(stu.name,"zhangsan"); stu.sex='M'; stu.age=10; printf("%s %c...%d\n",stu1.name,stu1.sex,stu1.age); printf("%s %c %d\n",stu2.name,stu2.sex,stu2.age); printf(...%d\n",a[i].name,a[i].sex,a[i].age); } return 0; } 结构体指针 结构体指针是指向结构体变量的指针,一个结构体变量的地址就是这个结构体变量的指针
结构体的基础知识: 结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。...结构体的声明: 以学生为例: typedef struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];...//学号 }Stu;//分号不能丢 struct Stu s = {"zhangsan", 20};//初始化 结构体传参: struct S { int data[1000]; int num;...}; struct S s = {{1,2,3,4}, 1000}; //结构体传参 void print1(struct S s) { printf("%d\n", s.num); } //结构体地址传参...; //传地址 return 0; } 结构体传参的时候,要传结构体的地址。
一、结构体 结构的基础知识 结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。...结构体初始化 ---- ---- 四.结构成员的类型 结构成员可以使标量、数组、指针、甚至是其它结构体 五.结构体变量的定义和初始化 有了结构体类型,如何定义变量 ---- ---- 六.结构体成员访问...6.1结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的 点操作符接受两个操作数。...---- 6.2结构体指针访问指向变量的成员(箭头操作符 ->) 有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。...如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销过大,所以会导致性能的下降。 结论:结构体传参的时候,要传结构体的地址。
结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。...结构的成员可以是标量、数组、指针,甚至是其他结构体。...1.4 结构体变量的定义和初始化 有了结构体类型,那如何定义变量,其实很简单。...结构体成员的访问 结构体变量访问成员 结构变量的成员是通过点操作符( . )访问的。点操作符接受两个操作数。...如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。 结论: 结构体传参的时候,要传结构体的地址。
1.2 结构的特殊声明 有一种结构体叫做匿名结构体,这种结构体只能使用一次,匿名结构体没有结构体标签 struct { int a; char b; float c; }x; struct {...对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。...那在设计结构体的时候,我们既要满⾜对⻬,⼜要节省空间,如何做到: //例如: struct S1 { char c1; int i; char c2; }; struct S2 { char c1...#include #pragma pack(1)//设置默认对⻬数为1 struct S { char c1; int i; char c2; }; #pragma pack(...结构体实现位段 4.1 什么是位段 1. 位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以 选择其他类型。 2.
对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值,在VS2022中 默认是8 Linux 和 gcc中没有默认设定参数,对其书加上成员自身的大小 ...数倍 例如 struct A { char a; int b; char c; }; struct B { char a; char b; int c; };...struct C { int c; char a; char b; }; struct D { int a; short b; char c; }; int main() { printf...//4个字节 4-7 4的倍数正好 8 }; struct C { int c;//4 0-3 char a;//1 4 char b;//1 5 因为要是4的倍数 占到8 }; struct...D { int a;//4 0-3 short b;//2 4-5 char c;//1 6 因为要是4的倍数 占到8 }; 注意:如果用#pragma 与粗粒命令,可以改变编译器的默认对齐数 #
前言 还记得我在总结操作符时,涉及到了结构体,在C语言中类型分为两大类一个是内置类型,一个是自定义类型,常见的内置类型我们不说,我们今天来好好看一看为自定义类型之一的结构体吧 个人主页:小张同学zkf...\n" , sizeof ( struct S1)); 来看一下,这道题char c1变量大小是1吧,它是第一个成员,对齐到偏移量为0的地址处,接下来的成员int i 大小为4,与vs默认的...还是按上面的思路分析,首成员大小为1,与默认对齐数8比交,1是最大对齐数,因为是首成员,所以从偏移量为0开始,占一个字节,接着这个结构体s3是上面那个练习题的s3,此时我们要知道结构体的对齐数为里面成员的最大对齐数最大的那个数...,上面s3我们在求时最大对齐数中最大值为8,所以被用来当作这个结构体s3的对齐数,与默认的8比较相等,所以要在偏移量为8的倍数处存储,这个就在偏移量为8处向后16个字节,到偏移量为23处,第三个成员double...为8个字节与默认8比较相等,就在8的倍数处存储,此时就在偏移量24处存储,此时三个成员最大对齐数中的最大值为8,此刻总大小为32正好是8的倍数,所以这个结构提的总大小为32.
让我们走进结构体 一.结构体 1.1 什么是结构体 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。...1.2 结构体的声明 例如用结构体描述一个学生 1.3 特殊的声明 在声明结构体时,可以不完全声明,也就是匿名结构体类型 1.4 结构的自引用 结构的自引用就是自己作为自己的成员变量 但是要注意正确的引用方法...结构体变量的嵌套初始化 1.6 结构体内存对齐 来计算一下结构体的大小 来计算一下结构体的大小如果不了解的话可能会觉得是 6 6 13 为什么最终结果会是这样呢?...这就要掌握首先得掌握结构体的对其原则 1.6.1结构体的对其原则 一. 二.结构体嵌套问题 为什么存在内存对齐?...如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。 因此结构体传参的时候,要传结构体的地址。
领取专属 10元无门槛券
手把手带您无忧上云