C语言结构体详细教学开始

前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。

在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:

struct 结构体名{

结构体所包含的变量或数组

};

结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。请看下面的一个例子:

struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩};

stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。

注意大括号后面的分号;不能少,这是一条完整的语句。

结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。

像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。

结构体变量

既然结构体是一种数据类型,那么就可以用它来定义变量。例如:

struct stu stu1, stu2;

定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员组成。注意关键字struct不能少。

stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。

你也可以在定义结构体的同时定义结构体变量:

struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩} stu1, stu2;

将变量放在结构体定义的最后即可。

如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体名定义其他变量,那么在定义时也可以不给出结构体名,如下所示:

struct{ //没有写 stu char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩} stu1, stu2;

这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。

理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,例如上面的结构体变量 stu1、stu2 的内存分布如下图所示,共占用 4+4+4+1+4 = 17 个字节。

但是在编译器的具体实现中,各个成员之间可能会存在缝隙,对于 stu1、stu2,成员变量 group 和 score 之间就存在 3 个字节的空白填充(见下图)。这样算来,stu1、stu2 其实占用了 17 + 3 = 20 个字节。

关于成员变量之间存在“裂缝”的原因,我们将在《C语言内存精讲》专题中的《C语言内存对齐,提高寻址效率》一节中详细讲解。

成员的获取和赋值

结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[ ]获取单个元素,结构体使用点号.获取单个成员。获取结构体成员的一般格式为:

结构体变量名.成员名;

通过这种方式可以获取成员的值,也可以给成员赋值:

#include int main(){ struct{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 } stu1; //给结构体成员赋值 stu1.name = "Tom"; stu1.num = 12; stu1.age = 18; stu1.group = 'A'; stu1.score = 136.5; //读取结构体成员的值 printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!

c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...相关推荐

  1. c语言sleep函数_做游戏,学C语言,小球碰撞游戏,菜鸡者从黑窗口到图形化编程...

    CMD黑窗口小球运动 这次教程,我们实现一个弹跳小球.需要学习完基础的变量.运算符.表达式,printf.scanf输入输出函数的用法,if-else.while.for语句的用法. 第1步,显示静止 ...

  2. r语言做断轴_手把手教你用R语言做回归后的残差分析

    本文介绍了做残差分析的方法及其重要性,以及利用R语言实现残差分析. 在这篇文章中,我们通过探索残差分析和用R可视化结果,深入研究了R语言. 残差本质上是当一个给定的模型(在文中是线性回归)不完全符合给 ...

  3. 老徐教你学C语言(C语言进门教程)

          都说C语言是所有语言的根基--得C语言者得天下,为了更好的方便初学者入门,特编辑了以下C语言进门教程--老徐教你学C语言,希望对初学者有所帮助   00.老徐教你学C语言--C语言学习之道 ...

  4. 有没有c 或c语言的短期培训学校,根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样...

    根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样 首页 > 软件 > 根河学c语言编程 作者:镀金池   发布时间:2017-11-30 11:02 另外,尽早调 ...

  5. ios开发语言本地国际化_开发人员软件本地化最终语言指南

    ios开发语言本地国际化 There are lots of great guides out there for how to prep your product for international ...

  6. c 语言 double 除法_这是我的C语言入门笔记

    点击上方"C语言中文社区",选择"设为星标★" 技术干货第一时间送达! 来自:大鱼机器人 精彩回顾: [万字长文]C语言高效编程与代码优化,建议收藏![推荐] ...

  7. 《手把手教你学C语言》学习笔记(1)---C语言的特点

    学习C语言的原因,主要是需要使用C语言编程,我用故我学,应该是最主要的原因了. C语言的定位:C语言严格意义上只能算是中级语言,是面向过程编程语言的集大成者,虽然这种语言有很多的问题,但总体而言是瑕不 ...

  8. python中字典的value可以为任意对象_手把手教你学Python之字典

    字典是一种无序可变的容器,字典中的元素都是"键(key):值(value)"对, "键"和"值"之间用冒号隔开,所有"键值对&qu ...

  9. c语言搜索答案什么软件比较好,学C语言用什么最好?

    2008-02-07 回答 C语言是很好的,如果你学并决定要学好,恭喜你.你的选择是对的. C的优点就不用多说了,一大堆. 我想给你推荐两个工具: 1,有学有练轻松简单学C语言---苦丁香C语言速成 ...

最新文章

  1. Apache遇到的问题:APR not found
  2. Laravel 任务调度(Console)
  3. Problem C: 括号匹配(栈和队列)
  4. LeetCode--11.盛最多的水(双指针,暴力)
  5. chrome 样式Bug?
  6. linux修改环境截图,Linux环境下php实现给网站截图的方法.docx
  7. 多重背包单调队列优化思路_单调队列优化多重背包问题
  8. 【物联网毕设基础】实时时钟芯片 DS1302 介绍
  9. elasticsearch使用3:配置同义词词库、ik分词器扩展字典和扩展停止词字典
  10. flex blazeds java_Flex使用Blazeds与Java交互及自定义对象转换详解
  11. DM数据库体系结构介绍
  12. SAP开发-同时定义同名的工作区、内表 OCCURS 0 WITH HEADER LINE
  13. portswigger 目录遍历文件上传
  14. 笔记本快捷键(fl980)
  15. Java支付宝APP支付-验证异步通知消息
  16. 共享充电宝有什么好拍? | 拍者手记
  17. 星淘惠:四川一地获批设立跨境电子商务综合试验区跨境电商再添新砖
  18. 网站安全与渗透测试工程师岗位区别
  19. centos内核升级的两种方法
  20. Oracle EBS AR收款核销异常会计事件ID丢失修复

热门文章

  1. 采用Angular勾画SVG圆环形进度条
  2. 顺丰物流单号查询效果(可输入多个文本框)
  3. JQuery元素操小结
  4. 郝蕾怒骂河南人---江湖再起风云,网络哪里有净土
  5. 今天的不是陶渊明的 飞鸽传书
  6. CSS选择器的权重详解
  7. IOCP加Windows线程池打造高伸缩性高性能的服务器应用
  8. 从两道经典试题谈C/C++中联合体(union)的使用
  9. 专家:番茄花园洪磊最高可判刑7年
  10. 诺基亚计划推出高档触摸屏手机以对抗iPhone