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个整形的大小,会有时间和空间上的系统开销,参数压栈的的系统开销比较大,所以会导致性能的下降。
所以,结构体传参,要传结构体的地址。
C语言-轻松掌握|struct结构体|知识点相关推荐
- 【C语言笔记】struct结构体变量的用法
我们都知道C语言中变量的类型决定了变量存储占用的空间.当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float. 那么,当我们要做一 ...
- 【零基础学C语言】知识总结八:struct 结构体与 union 共用体
struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...
- Go语言核心之美 3.4-Struct结构体
struct(结构体)也是一种聚合的数据类型,struct可以包含多个任意类型的值,这些值被称为struct的字段.用来演示struct的一个经典案例就是雇员信息,每条雇员信息包含:员工编号,姓名,住 ...
- C语言的几种结构体Struct的赋值方法
C语言的几种结构体Struct的赋值方法 1. 定义结构体类型 这里是两个结构体的基本结构. struct Init{int a;float b;double c; }I1; struct SIMPL ...
- c语言用typedef定义结构体,C语言结构体定义 typedef struct
c语言规范,定义结构体: typedef struct ANSWER_HEADER { u8 u8Type; u8 u8Code; u32 u32TimeStamp; struct ANSWER_HE ...
- 用JAVA定义两个结构体_c语言struct结构体的定义和使用
c语言由于不像java,c#,c++等语言有对象,所以就用struct结构体来表示,其实作用是差不多的,下面来快速学习c语言struct结构体的定义和使用,以学生类student来举例,有三种定义方式 ...
- c语言struct的作用和用法,c语言中的关键字struct(结构体)的用法
在iOS开发中,结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视. 当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据.然而 ...
- C语言自定义变量类型——结构体详解
文章目录 前言 为什么要学习结构体 什么是结构体 一.结构体:struct 1.结构体类型的声明 (1)结构体的基础知识 (2)结构体的声明 (3)特殊的声明 2.结构体的自引用 3.结构体变量的定义 ...
- Golang 基础知识(十一.struct结构体)
struct结构体 1.定义 2.匿名结构体 3.键值对初始化 4.构造函数 4.1 (值)方法和接收者 4.2 (指针)方法和接受者 4.3 结构体的"继承 4.4 序列化与反序列化 4. ...
最新文章
- Python经典面试题100道(附PDF下载地址)
- 奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题
- 记录自己的学习和经验
- 【Python CheckiO 题解】House Password
- java网站短信接口_网云JAVA短信接口API
- android 中如何监听按键的长按事件
- GOF23种设计模式在Java中的应用(part 1)
- python的列表find_python的list有没有类似js的find方法?
- angular6、7 兼容ie9、10、11
- C语言库函数源码在线,C语言库函数(包括所有函数)
- 利用DMRMAN备份时出现“管道连接失败”的错误信息的解决方法
- 农产品管理系统-毕设
- xcode打包cordova项目生成ipa
- db2从文件读到数据库
- vue-awsome-swiper稳定版本3.1.3及使用方法,API见swiper官网https://www.swiper.com.cn/api/index.html
- 在日软件工程师的远虑近忧
- atom平台 android ia,ZTE Grand X IN:搭载Atom平台的Android机
- 《麻省理工学院公开课:人工智能》笔记三
- Solidity 投票案例
- git 的批量克隆 批量切换分支 批量pull
热门文章
- else if函数 c语言,C语言入门 — if else
- Java锁——什么是锁?
- 狄克斯特拉(Dijkstra)算法求一个顶点到其余各个顶点的最短路径
- 文化基因算法(Memetic Algorithm)研究进展(文化基因算法新手入门)
- Mr.Nobody观后感
- Intel RealSense CAD files(STL 模型)
- 4、输入一元二次方程的三个系数,求根。
- linux磁盘io调优,Linux系统管理和调优(内存、CPU、磁盘IO、网络)
- 以selenium模拟登陆12306
- 嗯,还在用Ajax嘛?Fetch了解一下呀