在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{  //没有写 stuchar *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 <stdio.h>
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!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);return 0;
}

运行结果:
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:

struct{char *name;  //姓名int num;  //学号int age;  //年龄char group;  //所在小组float score;  //成绩
} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };

不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。

C语言结构体(Struct)——摘自C语言学习网相关推荐

  1. c语言结构体定义蚂蚁,C语言结构体(struct)常见使用方法

    C语言结构体(struct)常见使用方法 C语言结构体(struct)常见使用方法 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合) ...

  2. C语言 结构体Struct 中冒号的用法

    C语言 结构体Struct 中冒号的用法 本文有部分内容参考菜鸟教程-C 位域 . 关于"位域"的说明 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位. ...

  3. c语言结构体和联合体,C语言结构体和联合体

    1.单链表插入 #include #include #define FALSE 0 #define TRUE 1 typedef struct NODE{ STRUCT NODE *link; int ...

  4. C语言 结构体 struct Cat cat1;

    引入 使用传统技术解决 需要定义多个变量或数组 结构体与结构体变量的关系示意图 类似Java类中的对象(结构体)与属性(结构体变量) 一切物体都可以看作对象(结构体) 补充:C语言数据类型 简单使用案 ...

  5. C语言结构体struct详解与实例

    目录 1.定义 2.应用 2.1初始化 2.2使用 3.结构体对齐规则与存储 1.定义 C语言中结构体(struct关键字定义)是一种自定义数据类型.通过结构体的定义可以将多种不同类型数据形成一个组合 ...

  6. 关于C语言结构体(struct)介绍

    转自:微点阅读  https://www.weidianyuedu.com 导读:       C语言结构体,怎么理解? 你可以把它想象成一个桌面上的文件夹,这个文件夹里面可以有各种各样的文件,当然也 ...

  7. C语言——结构体struct与typedef的使用

    我们常常在某些C语言代码中看到有时候typedef关键字和struct一起连用定义结构体,有时候只用struct关键字直接定义结构体,在此记录两者的一些用法,给自己做一个笔记,希望对大家也有所帮助.如 ...

  8. C语言怎么存储结构体,C语言结构体Struct怎么使用?

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

  9. c语言结构体的位操作,C语言之路---结构体、位运算及预处理命令

    一.结构体 1).概念 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member). 结构体也是一种数据类型,它由程序员自己定 ...

  10. c语言结构体编程,[编程] C语言的结构体详解

    结构体 struct 结构体名{}变量名; 结构体变量: struct person{ char *name; int age; float score; } student; 成员的获取和赋值 // ...

最新文章

  1. Bootstrap方法为页面添加一个弹出框
  2. IntelliJ IDEA 2020.2 发布:支持Java 15、GitHub审查、运行时异常的排查辅助...
  3. php+yii手册下载,yii中文手册-yii框架中文手册教程下载pdf格式免费版-东坡下载
  4. Java中集合中根据对象的某个属性去重
  5. 8-10 牛客网刷题知识点集合
  6. 适合小白的Python学习大纲
  7. 张鹏 html 笔记,传智 张鹏 html+css 课程 笔记2(吐血整理)
  8. 【第二周】结对编程(宫丽君和林莉):四则运算
  9. Apache安装成功,测试时无法跳出It works!页面
  10. 基于相似性网络融合的目标分类研究
  11. 苹果手机微信语音没声音怎么回事_iPhone XS Max相机、普通照片模式下拍照没声音怎么办?...
  12. C++中endl、ends和flush作用:
  13. LWN:两组跟memory-tier有关的patch!
  14. NSDate 转为NSString 时差的问题
  15. Python 模拟登录AUSU路由器获取在线用户列表
  16. CSP 201803-4 棋局评估
  17. 人生就是一场永不停歇的修行
  18. Python 最详细的 socket 相关内容解读
  19. 索尼xzp升级android p,索尼XZP国行版升级安卓8.0 相机功能优化
  20. 互联网摸鱼日报(2022-11-10)

热门文章

  1. 赵小楼《天道》《遥远的救世主》深度解析(16)丁元英停止私募基金不可言说的原因
  2. VSCode 中怎样快速切换多个项目
  3. 优锘:发布一站式数字孪生平台森工厂,打造数字孪生领域的office
  4. CR渲染器全景图如何渲染颜色通道_无需凤凰流体,就可以制作3D火焰效果?「渲云渲染」...
  5. 斯坦福大学公开课IOS 7学习笔记 (1)
  6. 苹果设邮箱的126服务器,Mac系统中的邮箱创建126邮箱帐户的方法
  7. standard fifo和fwft fifo的区别
  8. efi分区能不能删除 win10_Win10删除了EFI分区:以下是恢复它的方法
  9. 使用腾讯云paas服务接口通过视频进行活体校验-人脸识别
  10. mysql fk_MySQL FK的正确命名约定是什么?