首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c语言——自定义类型:结构体

1.结构体类型的声明 #define _CRT_SECURE_NO_WARNINGS #include //struct:关键字 tag:自定义标签名(可随意修改) struct tag...那么解决这个问题的最好办法就是定义结构体的时候不使用匿名结构体 3.结构体成员访问操作符 在结构体中,有  (. ) 和  (->) 两种运算符,其中 (.) ...运算符是用来直接访问结构体或者联合体变量的成员,而(->)是用于通过指针来访问指向结构体或者联合体的成员 4.结构体内存对齐 首先了解一下对齐规则: 1.结构体的第一个成员对齐到和结构体变量起始位置偏移量为...对齐数=编译器默认的一个对齐数与该成员变量大小的较小值 较小值看其编译器:在vs中默认值一般为8,而linux中gcc没有对齐数,对齐数就是成员自身大小 3.结构体总大小为最大对齐数(结构体在每个成员变量都有一个对齐数...char c1; char c2; int i; }; #pragma pack()//取消设置的对齐数,还原默认 #pragma pack(1)//设置默认对齐数为1 #pragma

7810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言:自定义类型——结构体

    C语言为了解决这个问题,增加了结构体这种自定义的数据类型,让程序员可以自己创造适合的类型。        ...2.匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。 对匿名结构体重命名,操作如下图 此时的S为该匿名结构体的标签,可以利用他来创建该结构体类型变量。...⽐如,定义⼀个链表的节点: 仔细分析,这其实是不行的,因为结构体中在包含一个同类型的结构体,这样结构体就会无穷的大,是不合理的! 正确的自引用方式应该是包含下一个结构体的指针类型!...通过以上对齐规则,我们来解析刚刚的代码: s1:c1在偏移量为0的地方         c2的对齐数是1,放在1的倍数处即可,所以可以放在1的位置         i的对齐数是4,要放在4的倍数处,所以从...s2:c1在偏移量为0的地方         i的对齐数是4,要放在4的倍数处,所以从4开始放,一直放到7         c2的对齐数是1,放在1的倍数处即可,所以可以放在8的位置  全部放完占用了9

    10710

    【C语言】自定义类型:结构体

    比如,定义一个链表节点: struct Node { int data; struct Node next; };    这个代码中,data是节点的数据,而struct Node next就包含了下一个节点...   首先我们来看第一条规则:结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处    这是什么意思呢?...,是char类型的c2,大小为1,比VS默认对齐数小,所以它的对齐数是1,任何整数都是1的倍数,所以可以直接挨着c1存放c2,如图:    最后就是一个整型成员i,它的对齐数为4,所以必须对齐4...d,对齐数为8,而刚刚我们从偏移量为8的位置到了偏移量为23的位置,下一个24刚好就是8的倍数,所以可以直接放进去,如图:    目前算出来结构体S4的大小为32个字节,当然我们要看这个结构体的最大对齐数...我们首先要知道传值调用和传址调用的区别,可以参照博客:【C语言】手把手带你拿捏指针(1)(初始指针)    然后我们开始分析,在传值调用时,函数会创建一个和这个结构体一模一样的结构体形参,此时会占用空间

    13210

    【c语言】自定义类型----结构体

    结构体是c语言的一种自定义类型,自定义类型对于开发者及其重要的类型,它可以随意由开发者进行谱写功能,而今天的结构体可以用来表示一种变量的单个或多种具体属性,再编写代码时有着不可替代的作用!!!!...前言:自定义类型 什么是自定义类型?我们在编写代码的过程中,会遇到许多类型,比如:短整型,整型,字符类型,布尔型,浮点型等多种类型,可这些都是c语言库中自带的,编写者在编写过程中只需要记住就好。...举个例子:你要定义一个变量为整数,就需要定义该变量为int型,写一个字符,就要定义一个char类型。...定义时只需对应拿出即可,但是你要定义一个人的基本信息怎么办,如电话,地址,性别,名字,身份等多种属性,在c语言给出的类型中,并没有具体的类型可以去定义,所以这时就需要编写者自己根据具体的需求,去编写自己的类型...,n大小为4字节 第三个成员c2的大小为1,比vs默认偏移数8小,所以偏移数就是1,所以n从第九个字节开始,c2大小为1字节 在此还未结束,因为结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数

    9610

    C语言---自定义类型:结构体

    结构体 自定义的类型:结构体、联合体、枚举 结构是一些值的集合,这些值成为成员变量,结构的每个成员可以是不同类型的变量 //描述一本书:书名、作者、定价、书号 //结构体类型---类似于整型、浮点型...//不管是S1还是S2,他们的成员在内存中不是一个放完就放另一个的 //其实是存在对齐现象的 结构体对其的规则: 1.结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处 2.其他的成员变量要对齐到某个数字...我们还要根据第三条进行判断 3.结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数, 所有对齐数中最大的)的整数倍 这三个成员的默对齐数是最大对齐数是4, 那么在这里结构体的大小就是...c2; }; int main() { struct S2 s2; return 0; } /* 根据规则 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处 因为c1...,构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处 //那么0-就是d占了 /* 对于c来说,c大小1个字节,vs默认对齐数是8,因为1c的对齐数是1 那么只要是1的倍数就行了

    5710

    【C语言】自定义类型:结构体

    结构体类型的声明 结构体是一种类型,类似于 int、char、double 等,只不过结构体类型是一种自定义类型。 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。...结构体的自引用 在结构体中包含一个类型为该结构体本身的成员是否可以呢? 比如,定义一个链表的节点,在这个节点处能够找到下一个节点的位置及其数据。...所以定义结构体不要使用匿名结构体。 1 typedef struct Node 2 { 3 int data; 4 struct Node* next; 5 }Node; 4....结构体内存对齐 结构体的大小是多少呢? 在计算其大小之前,我们要了解什么是结构体内存对齐。 4.1. 对其规则(面试考点) 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。...VS默认的对齐数为8,Linux中gcc没有默认对齐数,对齐数就是成员自身的大小。 结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍。

    8410

    C语言自定义类型之结构体

    c; }a[20], * p; 上面两个结构体在声明是省略了结构体标签(tag) 那么问题来了 //在上⾯代码的基础上,下⾯的代码合法吗?...匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。 结构的自引用 在结构中包含一个类型为该结构本身的成员应注意什么呢?...typedef 对匿名结构体类型重命名,也应注意定义的先后顺序,避免混淆 typedef struct { int data; Node* next;//因为Node是对前⾯的匿名结构体类型的重命名产...这就是结构内存对齐导致的差异,下面我们先来了解一下它的基本概念: 结构体内存的对齐规则 1.结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处  2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处...3.结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的 整数倍。

    10910

    C语言_结构体

    一、结构体 结构的基础知识 结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。...数组: 一组相同类型元素的集合; 结构体:其实是一组不一定相同类型元素的集合; 复杂对象,不能通过内置类型直接描述和表示,就用结构体来描述复杂类型。...结构体初始化 ---- ---- 四.结构成员的类型 结构成员可以使标量、数组、指针、甚至是其它结构体 五.结构体变量的定义和初始化 有了结构体类型,如何定义变量 ---- ---- 六.结构体成员访问...---- 6.2结构体指针访问指向变量的成员(箭头操作符 ->) 有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。...如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销过大,所以会导致性能的下降。 结论:结构体传参的时候,要传结构体的地址。

    13720

    C语言结构体

    1.2 结构的特殊声明 有一种结构体叫做匿名结构体,这种结构体只能使用一次,匿名结构体没有结构体标签 struct { int a; char b; float c; }x; struct {...定义结构体不要使⽤匿名结构体了 typedef struct Node { int data; struct Node* next; }Node; 2....这也是⼀个特别热⻔的考点: 结构体内存对⻬ 2.1 对⻬规则 ⾸先得掌握结构体的对⻬规则: 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字(对⻬数)...VS 中默认的值为 8  -Linuxgcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩ 3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的整数倍。...#include #pragma pack(1)//设置默认对⻬数为1 struct S { char c1; int i; char c2; }; #pragma pack(

    5710

    C语言结构体

    结构体         结构体的声明 struct TAG { //member_list;//结构体内部成员 }/*variable*/;//结构体的名字,或者指针在这里         例如 struct...struct Node* next; }; int main() { struct Node A = { 1, &A }; A.next->number = 2; } 也可以用typedefine来重定义结构体...重点 结构体内存对齐         ⾸先得掌握结构体的对⻬规则:                 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处                 ...⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中                 最⼤的)的                 整数倍。                 ...pragm pack(1)//设置默认对齐数为1 #pragm pack( )//取消设置默认对其书  结构体传参 struct A { int a; }; void printfA(struct A

    8910

    C语言——结构体

    让我们走进结构体 一.结构体 1.1 什么是结构体 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。...1.2 结构体的声明 例如用结构体描述一个学生 1.3 特殊的声明 在声明结构体时,可以不完全声明,也就是匿名结构体类型 1.4 结构的自引用 结构的自引用就是自己作为自己的成员变量 但是要注意正确的引用方法...如果这样引用结构体的大小将会是无穷大 所以我们引入指针 这样才能达到自引用的目的 1.5 结构体变量的定义和初始化 1.5.1 结构体变量的定义 1.5.2 结构体变量的初始化 1.5.3...如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。 因此结构体传参的时候,要传结构体的地址。...位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

    8210

    【C语言】结构体

    前言 还记得我在总结操作符时,涉及到了结构体,在C语言中类型分为两大类一个是内置类型,一个是自定义类型,常见的内置类型我们不说,我们今天来好好看一看为自定义类型之一的结构体吧 个人主页:小张同学zkf...解决方案如下:定义结构体不要使用匿名结构体了 typedef struct Node { int data; struct Node * next ; }...,所以是4的整数倍,此时空间大小为为9不是4的整数倍,那就是空几个空间到12就是4的整数倍,所以结构体大小为12 再来一道 // 练习 2 struct S2 { char...此时总大小为16,16正好为最大对齐数中最大的值为8的整数倍,所以此时大小就是结构体的总大小为16 如果结构体里套一个结构体,那结果会是什么那 我们来看一下 struct S4 {...结束语 结构体知识就总结到这里了,下篇博客我们来看看同为自定义类型家族的联合体和枚举 OK,感谢观看!!!

    12410

    C语言——结构体

    1.2 结构的声明 struct tag { member - list ; } variable - list ;( 这里定义的结构体变量是全局变量 ) 例如描述一个学生...1.4 结构体变量的定义和初始化 有了结构体类型,那如何定义变量,其实很简单。...struct Point { int x; int y; }p1; //声明类型的同时定义变量p1 struct Point p2; //定义结构体变量p2 //初始化:定义变量的同时赋初值。...访问 age 成员 结构体指针访问指向变量的成员 有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。 那该如何访问成员。...如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。 结论: 结构体传参的时候,要传结构体的地址。

    12810

    C语言——结构体

    一.结构体 在C语言中,有许多的内置类型,如char、int、double等等,但仅仅有这些类型是远远不够的。 假如要描述一个学生,那么他的名字、身高、体重、成绩等等都需要考虑。...为此,C语言提供了结构体这样的自定义类型。结构体的每个成员可以是不同类型的变量。...结构体变量的定义和初始化 struct S1 { int i; int j; }s1; //声明类型的同时定义变量s1 s1 = { 6,7 }; //初始化s1 struct Stu { char...* p; }s2 = { 3,{3,4},NULL }; //结构体嵌套初始化 上面这三种方式是比较常见的结构体变量的定义和初始化。...结构体的自引用 我们可以思考下在结构体中包含⼀个类型为该结构体本⾝的成员是否可以呢? 比如定义⼀个链表的节点 仔细思考下,我们就会发现这样的做法是不可取的。

    12710

    【C语言】结构体

    前言 在C语言中,有两种类型,一种是内置类型,可以直接使用,包括char short int long long long float double;一种是自定义类型,当内置类型不能满足时,支持自定义一些类型...所以定义结构体不要使用匿名结构体了。 3. 结构成员访问操作符 结构成员访问操作符有两个⼀个是 . ,⼀个是 -> ....对于s1而言:char c1,占一个字节,而VS中默认的值为8,1小,所以选择1,而结构体的第⼀个成员对齐到相对结构体变量起始位置偏移量为0的地址处。所以c1就占了0。...总的用了8个地址空间 最后最后因为结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍,这里最大的为4,所以就是8 对于s2而言: char c1和s1中的一样...总的共用了9个 最后因为结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍,这里最大的为4,所以最后结构体的大小就是12 对于嵌套 struct S3

    16910

    C语言——M自定义类型:结构体

    {0}; return 0; } 3、结构的自引用 在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?...解决⽅案如下:定义结构体不要使用匿名结构体。 typedef struct Node { int data; struct Node* next; }Node; 二....1、对齐规则 ⾸先得掌握结构体的对⻬规则: 1.结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处; 2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。...VS 中默认的值为 8 ; Linux中gcc没有默认对齐数,对齐数就是成员自身的大小。 3.结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的整数倍。...#include #pragma pack(1)//设置默认对⻬数为1 struct S { char c1; int i; char c2; }; #pragma pack(

    10010

    C语言——自定义类型之结构体

    前言 本篇文章主要介绍自定义类型中的结构体。...一、结构体定义(声明) 直接用一个例子说明一下: 二、结构体类型的变量 ①全局变量:  ②局部变量: 三、特殊结构体 一种特殊的结构体——匿名结构体 1.匿名结构体指的是没有命名的结构体,这种结构体只能在定义结构体时创建变量...四、结构体的嵌套定义 结构体是可以嵌套定义的,即在一个结构体类型中可以包含另一个结构体类型:  结构体可以嵌套使用,也可以自引用。...(例如:数据结构中的链表实现) 五、结构体变量的定义和初始化 结构体类型的变量的定义和初始化和内置类型是相同的,全局变量和局部变量的定义在上文中都有介绍,所以这里主要说明当结构体有嵌套情况时该怎么初始化...2.内存对齐的规则 1.首先明确:结构体变量在内存中 第一个字节相对于起始位置的偏移量为0; 第二个字节相对于起始位置的偏移量为1; ……以此类推。

    67810
    领券