结构体:是一种复合数据类型,多种数据类型集合在一起用来描述事物的整体
与数组类似,数组是都个相同类型的数据合在一起,而结构是多个不同类型的数据合在一起。
结构体归根结底是一种数据类型,由程序员根据需要自由设计的。先设计数据类型:一般结构体的设计写在函数外(头文件中)
struct 类型名
{
类型1 变量名1;
类型2 变量名2;
…………
};
使用设计好的结构类型定义结构对象;
1、 struct 类型名 结构对象名;
2、 访问对象中的成员 对象名 成员变量名
设计好结构类型后,在使用时struct必要加上,但可以通用类型重定义省略struct关键词
结构变量使用堆内存:Struct 结构名* 指针=malloc(sizeof(struct 结构名));
结构指针->成员

计算结构体的字节数:
结构的成员的顺序会影响结构体的字节数,合理的排序成员的顺序可以节约内存
为了让结构变量更快访问成员,成员之间会进行对齐和补丁
对齐:(假定第一个成员从0地址开始)成员地址编号必须是它字节数的整数全部,如果不是则填充一些空字节
补齐:结构字节数必须是它最大成员的整数倍,如果不是则填充一些空字节
注意:Linux系统计算补齐、对齐时,成员的字节数超过4字节时按4字节计算,补和对齐是可以修改的
也可以指定成员所占的字节来节约内存

typedef可以为非常长的类型名重新取一个简短的名字

typedef unsigned int size_t;
在stdint.h头文件中在大量类型重定义
typedef unsigned char uint8_t
typedef unsigned short uint16_t
typedef unsigned int uint32_t
typedef unsigned long long uint64_t
typedef 也可以对结构体起一个简短的名字 typedef struct Student Student;
一般在结构设计时就进行类型重定义
typedef struct Student
{

}Student;
或者
typedef struct //结构体可以没有名字,匿名结构体,不建议这样,特殊场景不行(实现数据结构时)
{

}Student;
结构体要当做一个整体来使用,否则会更麻烦,例如可以为结构的显示封装出一个函数
当使用结构体变量为函数参数时,优先选择传递函数指针,否则就会拷贝整个结构体变量(效率低)
通过结构指针访问结构成员:Student* stup;
stup).name; // .的级别要高于
stup->name;
使用结构指针会造成结构对象被意外修改的风险,可以对结构指针加const来保护结构对象。
const Student* stup;
结构对象的初始化:struct 类型名 结构对象名={成员初始值…};
初始化的顺序要与结构体设计师的成员顺序一致
可以只初始化一部分,剩余的补0。
可以不按顺序初始化,但需要在初始化列表中指定成员名。
struct 类型名 结构对象名={.成员名=成员初始值};
结构对象既然是一种类型数据,也就可以定义结构数组。struct Student stu[100];//定义100个结构对象
stu[1].成员

由于结构体字节数比较多,一般不存储在栈内存中,而是存储在堆内存;
Student* stup=malloc(sizeof(Student));
定义结构数组;
Student* stup=malloc(n,sizeof(Student));

计算结构体的字节数:
注意:结构体成员的顺序会影响结构体的字节数。编译器为了访问结构体成员时速度能更快,对成员的排列进行了补齐和对齐
对齐:编译器规定成员内存起始地址必须时它自身大小的整数倍,如果不是则空着使用后面的地址
补齐:结构体的总字节数必须是它最大成员的整数倍,如果不够则空一些字节来保障

注意:在计算对齐和补齐时Linux超过4字节按照4字节来计算,而windows系统按规定计算
结构体中可以有指针、函数指针、但不可以有函数

C++的结构体中可以有成员是函数,但C的结构体中不可以有函数
结构体的成员是指针:需要在定义结构体对象后,再让它指向一个有效的内存空间

结构体对象之间可以直接赋值,结构体成员赋值只有初始化才能使用大括号批量赋值,定义结束后,就只能单个赋值。
Student stu ={“hehe”,‘m’,1234,750};
stu ={“haha”,‘w’,1234,750};

让你不再害怕结构体-C语言结构体详解相关推荐

  1. 第十章 结构体_C语言共用体(C语言union用法)详解

    通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:  un ...

  2. C语言结构体中定义函数指针详解

    C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...

  3. 【C语言】结构体定义 typedef struct 用法详解和用法小结

    结构体定义 typedef struct 用法详解和用法小结 文章目录 结构体定义 typedef struct 用法详解和用法小结 0. 前言 1. 首先:在C中定义一个结构体类型要用typedef ...

  4. 结构体,联合体,枚举详解

    结构体,联合体,枚举详解 目录 结构体 联合体 枚举常量 1.结构体 在C语言中,系统已经提供了一些数据类型,比如float,int,double,char等,但是我们有时会需要更复杂的类型来描述一个 ...

  5. 【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

    [排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...

  6. C语言自定义类型详解

    C语言自定义类型详解 一.结构体 1.结构的声明 2.特殊的声明 3.结构的自引用 4.结构体变量的定义和初始化 5.结构体内存对齐 6.修改默认对齐数 7.结构体传参 二.位段 1.什么是位段 2. ...

  7. c语言memset对应java,C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即"内存"(memory)的意思. ...

  8. c语言struct的作用和用法,c语言struct用法详解

    c语言struct用法详解 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为:struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包 ...

  9. 【C语言】操作符详解(超详细)

    hello~~,我是~小鹿,超级详细的操作符讲解来康康吧 可以收藏随时找到这里哦~ [C语言]操作符详解(超详细) 1.算数操作符:+,-,*,/,% 2.位移操作符:<< , >& ...

  10. c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf

    c语言练习题(带详解答案)1 (-2) -1: 一单项选择题 /为求商运算符,该运算符能够对整型.字符.浮点等类型的数 据进行运算,5/2 2 1.(A )是构成C语言程序的基本单位. 11.如果 i ...

最新文章

  1. python安装cvxpy
  2. vscode css智能补全_强大的 VS Code入门
  3. python批量改名_Python写个批量改名工具
  4. 一个有趣的算法问题:如何定义一个分数类
  5. sqrt开平方算法解析
  6. 【已解决】IDEA 配置tomcat后,javaweb项目报404
  7. 在Python,Java和Kotlin中标记参数和重载
  8. DFS:C 小Y的难题(1)
  9. HashMap的使用方法及注意事项
  10. Magento:Paypal付款不成功返回后不要清空购物车产品的解决方案
  11. 对比鸿蒙,Google 的 Fuchsia 当前进度如何?
  12. 要有多勇敢才敢对回忆念念不忘,还是喜欢流眼泪。学会成长坚强,相互理解而不是责怪。我安静点,我不哭了~...
  13. 【手写数字识别】基于matlab PCA手写数字识别【含Matlab源码 309期】
  14. 算法设计与分析——排序算法:十大排序算法总结
  15. 【crawler笔记】R语言简单动态网页爬虫(rvest包)示例
  16. Android studio环境变量配置及其作用(JDK与SDK配置)
  17. Gradle下载失败的解决办法
  18. 课堂作业:首尾相连求最大子数组
  19. neo4j图数据库--Cypher入门
  20. openjudge 1.9.14 铺地毯

热门文章

  1. gffread gffcompare 将gff与gtf格式的注释文件转换与合并
  2. Android CardView卡片
  3. 微软云盘OneDrive和Dropbox云盘的比较分析
  4. Java内存泄漏系列--匿名内部类导致内存泄露--原因/解决方案
  5. docker安装 hitchhiker --分布式压力测试
  6. Mark文档操作(一):CSDN默认MarkDown编辑器提示
  7. shell进入特权模式_特权模式下的命令
  8. Django知乎问答精选(第一期)
  9. R语言使用教程(一)——R和Rstudio安装
  10. linux 部署Javaweb项目