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

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

struct 结构体名{
    结构体所包含的变量或数组
};

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

复制纯文本复制

  1. struct stu{
  2. char *name; //姓名
  3. int num; //学号
  4. int age; //年龄
  5. char group; //所在学习小组
  6. float score; //成绩
  7. };
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 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。

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

复制纯文本复制

  1. struct stu{
  2. char *name; //姓名
  3. int num; //学号
  4. int age; //年龄
  5. char group; //所在学习小组
  6. float score; //成绩
  7. } stu1, stu2;
struct stu{char *name;  //姓名int num;  //学号int age;  //年龄char group;  //所在学习小组float score;  //成绩
} stu1, stu2;

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

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

复制纯文本复制

  1. struct{ //没有写 stu
  2. char *name; //姓名
  3. int num; //学号
  4. int age; //年龄
  5. char group; //所在学习小组
  6. float score; //成绩
  7. } stu1, stu2;
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 个字节。

成员的获取和赋值

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

结构体变量名.成员名;

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

复制纯文本复制

  1. #include <stdio.h>
  2. int main(){
  3. struct{
  4. char *name; //姓名
  5. int num; //学号
  6. int age; //年龄
  7. char group; //所在小组
  8. float score; //成绩
  9. } stu1;
  10. //给结构体成员赋值
  11. stu1.name = "Tom";
  12. stu1.num = 12;
  13. stu1.age = 18;
  14. stu1.group = 'A';
  15. stu1.score = 136.5;
  16. //读取结构体成员的值
  17. printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
  18. return 0;
  19. }
#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!

除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:

复制纯文本复制

  1. struct{
  2. char *name; //姓名
  3. int num; //学号
  4. int age; //年龄
  5. char group; //所在小组
  6. float score; //成绩
  7. } stu1, stu2 = { "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用法详解相关推荐

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

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

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

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

  3. sscanf c语言程序,C语言 sscanf用法详解

    /*sscanf用法详解*/#include /*sscanf头文件*/#include#include /*sscanf 读取格式化的字符串中的数据. swscanf 是 sscanf 的宽字符版本 ...

  4. c语言结构体定义和使用typedef,结构体定义typedef struct 用法详解

    typedef是类型定义的意思,typedef struct是为了使用这个结构体方便. 在了解typedef之前我们先来了解一下什么是结构体类型: C++提供了许多种基本的数据类型(如int.floa ...

  5. C/C++语法知识:typedef struct 用法详解

    第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定 ...

  6. C语言struct关键字详解—结构体

    struct 是个神奇的关键字,它将一些相关联的数据打包成一个整体,方便使用. 在网络协议.通信控制.嵌入式系统.驱动开发等地方,我们经常要传送的不是简单的字节流(char 型数组),而是多种数据组合 ...

  7. 结构体定义 typedef struct 用法详解和用法小结

    typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便. 具体区别在于:  若struct node{ }这样来定义结构体的话.在定义 node 的结构体变量时,需要这 ...

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

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

  9. C语言三目运算符用法详解

    对于条件表达式b ? x : y,先计算条件b,然后进行判断.如果b的值为true,计算x的值,运算结果为x的值:否则,计算y的值,运算结果为y的值. 一个条件表达式绝不会既计算x,又计算y.条件运算 ...

最新文章

  1. ​专为初学者设计——最小的神经网络
  2. #研发解决方案#智慧的太空桥管理智慧设备
  3. 机房冷热通道系统整体解决方案
  4. python中operator.itemgetter函数
  5. idea2018.3.5集成scala开发环境
  6. 《使用云计算和大数据进行性能测试》
  7. php 旋转图片 并保存,如何在PHP中旋转并保存图像
  8. [TJOI2010]阅读理解
  9. python的kite下载安装及使用_Kite下载|Kite Python编程工具 V1.2020.1203.0 最新版下载 - 下载银行...
  10. 北京大学计算机复试分数线,2014北京大学考研复试分数线公布
  11. php Switch语句
  12. 计算机断电后会丢失的是什么,计算机突然停电,什么数据会丢失?
  13. ASP.NET开发学习视频教程大全(共800集)
  14. Linux cut 实例
  15. 计算机制图的基本知识和技能,《计算机绘图基础》制图的基本知识和技能精讲.ppt...
  16. 财务会计 -- 什么是借贷
  17. 触摸DevOps,从现在开始DevOps之旅
  18. ubuntu18.04下YOLOV4测试和训练自己的数据集
  19. 吾心,吾思,吾语,吾记
  20. plc实验报告流程图_PLC实验报告——交通灯控制

热门文章

  1. CIS基准测试工具kube-bench使用
  2. 【舆情监测平台】舆情危机处置的四大原则。
  3. JSON解析基础使用知识-Java
  4. 这些数据爬虫网站,帮你工作提质增效,还不收藏?
  5. 自媒体新人常见问题汇总-千氪
  6. 免费思维导图软件, 简单脑图工具,支持导出图片
  7. linux显示子系统-framebuffer架构分析
  8. 数独算法c语言,数独求解算法C.
  9. Java JPG转TIF文件过大的解决方案(单张解决方案,多张可看以下参考链接)
  10. ARM服务器和云手游