C语言-轻松掌握|struct结构体|知识点

目录

        结构体的声明

        1.结构体的基础知识

        2.特殊的声明

        3.结构体的自引用

         了解数据结构-数据在内存的存储结构:

         之前犯过一个错误案例

        4.结构体变量的定义和初始化

         定义和初始化​

         嵌套结构体​

         5.结构体内存对齐

         实例演示

         计算方法

         为什么存在内存对齐?

         6.修改默认对齐数

         7.库函数获取变量偏移量

         8.结构体传参


结构体的声明

        1.结构体的基础知识

struct Stu
{
    char name[20];//名字
    int age;//年龄
    char sex[5];//性别
    char id[20];//学号
}; //分号不能丢

结构体是为了描述一个复杂对象而建立的一个类型块

其中struct关键字+结构体标签+中括号内的成员列表+以及不能遗忘分号来构成一个结构体类型

        2.特殊的声明

struct
{
    int a;
    char b;
    float c;
}x;

struct
{
    int a;
    char b;
    float c;
}a[20], *p;

没有标签名被称为匿名结构体类型,变量的创建只能在结构体定义结束、分号前创建,这种类型的

属于一个单独的类型,就好比没有名字的(孤勇者),*p = &x是不可取的

        3.结构体的自引用

这是一个错误的写法,next结构体变量里有无限个套娃next

这里就需要我们了解数据结构-数据在内存的存储结构:

       

 自己找到一个与自己同类型的另外一个节点,称为结构体的自引用

正确的写法是结构体类型包含一个同类型的结构体指针

结构体这样的功能才能实现链表

 我之前犯过一个错误案例

struct结构体首先是匿名结构体,中括号内的成员列表是对这个类型的定义,typedef类型重命名在struct结构体定义完成后才发生作用,Node*自然而然是未定义的

正确的写法:

 一方面next的初始化有明确的类型指针,另一方面也做到了类型的重命名(方便实用)。

        4.结构体变量的定义和初始化

从上面的不少例子得知,结构体变量的定义可以在与结构体类型定义后同时定义

常规结构体的定义和初始化

嵌套结构体的初始化

         5.结构体内存对齐

这个就有意思了,首先大概先了解一下,结构体内存对齐是一种语法规则,为了能够利用时间换空间的方法,提高访问速度或效率,求结构体大小需要掌握偏移量和对齐数。

实例演示:

计算方法:

 为什么存在内存对齐?

1. 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特
定类型的数据,否则抛出硬件异常。
2. 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访
问。


总结:用时间换空间

所以更加考虑既要满足对齐,又要节省空间,让占用空间小的的成员集中在一起

         6.修改默认对齐数

对齐数在VS里是默认对齐数与类型对齐数的较小值

其他编译器没有默认对齐数,所以对齐数是类型对齐数的大小

结构在对齐方式不合适的时候,我么可以自己更改默认对齐数

#pragma pack()   修改默认对齐数为1---#pragma pack(1)

#pragma pack()   恢复默认对齐数

         7.库函数获取变量偏移量

库函数offsetof(结构体类型名,成员变量名),头文件stddef.h,返回值是偏移量

        8.结构体传参

传值调用,函数参数是一份临时拷贝,需要重新在栈区上创建一块内存,date有1000个整形的大小,会有时间和空间上的系统开销,参数压栈的的系统开销比较大,所以会导致性能的下降。

所以,结构体传参,要传结构体的地址。

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值