目录

结构体的声明

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个整形的大小,会有时间和空间上的系统开销,参数压栈的的系统开销比较大,所以会导致性能的下降。

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

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

  1. 【C语言笔记】struct结构体变量的用法

    我们都知道C语言中变量的类型决定了变量存储占用的空间.当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float. 那么,当我们要做一 ...

  2. 【零基础学C语言】知识总结八:struct 结构体与 union 共用体

    struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...

  3. Go语言核心之美 3.4-Struct结构体

    struct(结构体)也是一种聚合的数据类型,struct可以包含多个任意类型的值,这些值被称为struct的字段.用来演示struct的一个经典案例就是雇员信息,每条雇员信息包含:员工编号,姓名,住 ...

  4. C语言的几种结构体Struct的赋值方法

    C语言的几种结构体Struct的赋值方法 1. 定义结构体类型 这里是两个结构体的基本结构. struct Init{int a;float b;double c; }I1; struct SIMPL ...

  5. c语言用typedef定义结构体,C语言结构体定义 typedef struct

    c语言规范,定义结构体: typedef struct ANSWER_HEADER { u8 u8Type; u8 u8Code; u32 u32TimeStamp; struct ANSWER_HE ...

  6. 用JAVA定义两个结构体_c语言struct结构体的定义和使用

    c语言由于不像java,c#,c++等语言有对象,所以就用struct结构体来表示,其实作用是差不多的,下面来快速学习c语言struct结构体的定义和使用,以学生类student来举例,有三种定义方式 ...

  7. c语言struct的作用和用法,c语言中的关键字struct(结构体)的用法

    在iOS开发中,结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视. 当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据.然而 ...

  8. C语言自定义变量类型——结构体详解

    文章目录 前言 为什么要学习结构体 什么是结构体 一.结构体:struct 1.结构体类型的声明 (1)结构体的基础知识 (2)结构体的声明 (3)特殊的声明 2.结构体的自引用 3.结构体变量的定义 ...

  9. Golang 基础知识(十一.struct结构体)

    struct结构体 1.定义 2.匿名结构体 3.键值对初始化 4.构造函数 4.1 (值)方法和接收者 4.2 (指针)方法和接受者 4.3 结构体的"继承 4.4 序列化与反序列化 4. ...

最新文章

  1. Python经典面试题100道(附PDF下载地址)
  2. 奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题
  3. 记录自己的学习和经验
  4. 【Python CheckiO 题解】House Password
  5. java网站短信接口_网云JAVA短信接口API
  6. android 中如何监听按键的长按事件
  7. GOF23种设计模式在Java中的应用(part 1)
  8. python的列表find_python的list有没有类似js的find方法?
  9. angular6、7 兼容ie9、10、11
  10. C语言库函数源码在线,C语言库函数(包括所有函数)
  11. 利用DMRMAN备份时出现“管道连接失败”的错误信息的解决方法
  12. 农产品管理系统-毕设
  13. xcode打包cordova项目生成ipa
  14. db2从文件读到数据库
  15. vue-awsome-swiper稳定版本3.1.3及使用方法,API见swiper官网https://www.swiper.com.cn/api/index.html
  16. 在日软件工程师的远虑近忧
  17. atom平台 android ia,ZTE Grand X IN:搭载Atom平台的Android机
  18. 《麻省理工学院公开课:人工智能》笔记三
  19. Solidity 投票案例
  20. git 的批量克隆 批量切换分支 批量pull

热门文章

  1. else if函数 c语言,C语言入门 — if else
  2. Java锁——什么是锁?
  3. 狄克斯特拉(Dijkstra)算法求一个顶点到其余各个顶点的最短路径
  4. 文化基因算法(Memetic Algorithm)研究进展(文化基因算法新手入门)
  5. Mr.Nobody观后感
  6. Intel RealSense CAD files(STL 模型)
  7. 4、输入一元二次方程的三个系数,求根。
  8. linux磁盘io调优,Linux系统管理和调优(内存、CPU、磁盘IO、网络)
  9. 以selenium模拟登陆12306
  10. 嗯,还在用Ajax嘛?Fetch了解一下呀