【1】结构体

1.概念:

由用户自定义的一种构造类型,用于描述一个复杂事物,表示多种不同类型数据的集合。

2.定义格式:

​ struct 结构体名
​ {
​ 数据类型 成员1;
​ 数据类型 成员2;
​ …
​ 数据类型 成员n;
​ };

3.结构体类型大小

1)字节对齐原则

​ 选取结构体成员中最大的类型跟value(4字节)比较,按字节数小的为标准开辟空间。

2)节省空间原则

​ 在保证数据不被破坏的前提下,尽可能向上压缩空间。

3)特殊情况:

四字节内部对齐原则

 struct num{char a;short b;  //4char c;   //4int d;    //4};

​ sizeof(struct num) = 12

【2】结构体变量

1.概念:

通过结构体类型定义的变量称为结构体变量。

2.定义方式:

​ [存储类型] [结构体类型] 变量名;

1)先定义结构体,再通过结构体类型定义结构体变量。
     struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格};struct phone ph1;

2)定义结构体的同时定义结构体变量。
   struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}ph2,ph3;

3)缺省结构体类型名定义结构体变量。
   struct {int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}ph1,ph2,ph3;

//注: 1.缺省结构体名定义变量时,只能在定义结构体的同时将所需变量定义好,
​ 后续无法再通过struct 结构体名去定义结构体变量了。
​ 2.一般用于结构体嵌套时,通常省略内层的结构体名。

3.结构体变量初始化

1)先定义结构体,再通过结构体类型定义结构体变量,定义变量的同时进行初始化。
  struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格};

struct phone ph1 = {1001,“华为”,“P50 Pocket”,“骁龙888 4G”,10988};

2)定义结构体的同时定义结构体变量,同时对结构体变量进行初始化。
 struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}ph2,ph3;
3)定义结构体变量时未初始化,后面再逐个成员赋值。

通过结构体变量名访问成员的形式:
通过 . 进行访问 : 结构体变量名.成员

  struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}ph3;ph3.id = 1003;strcpy(ph3.brand,"Apple");strcpy(ph3.mod,"iPhone13 pro max");strcpy(ph3.cpu,"A15");ph3.price = 998;

4.给结构体类型起别名

typedef 原类型名 自定义名;

  typedef struct {int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}PH;    PH ph1;typedef struct {char name[5]; int  id;struct{float Chinese;float Math;           float English;}s;}STU;STU student_1;strcpy(student_1.name,"陈剑");student_1.id = 2003101;student_1.s.Chinese = 60.5;

作业1:计算结构体大小(文档)
作业2:预习结构体数组。
从终端录入手机信息,写一个函数,该函数参数是结构体数组,
按照手机价格从低到高顺序输出手机信息。

【3】结构体数组

1.概念:

用于存放结构体变量的数组,结构体数组中存放的元素都是结构体类型的。

2.定义方式:

1)先定义结构体类型,再通过结构体类型定义结构体数组。
      struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格};

​ struct phone ph_arr2[5];

2)定义结构体的同时定义结构体数组。
  struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}ph_arr[5];

3.结构体数组初始化

1)先定义结构体类型,再通过结构体类型定义结构体数组,同时对结构体数组进行初始化。

struct phone ph_arr2[5] = {{1001,“华为”,“P50”,“骁龙888”,10499},{1001,“华为”,“P50”,“骁龙888”,10499}};

2)定义结构体的同时定义结构体数组,同时对结构体数组进行初始化。
  struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}ph_arr[5] = {{1001,"华为","P50","骁龙888",10499},{1001,"华为","P50","骁龙888",10499}};                                          
3)定5义结构体数组时未初始化,之后再对数组中的元素成员分别赋值。
  ph_arr[0].id = 1002;strcpy(ph_arr[0].brand,"小米");

4.结构体数组的输入输出

  struct phone ph_arr[5] = {0};scanf("%d",&ph_arr[0].id);通过循环进行优化:for(int i=0;i<5;i++){scanf("%d %s %s %s %f",&ph_arr[i].id,ph_arr[i].brand,ph_arr[i].mod,ph_arr[i].cpu,&ph_arr[i].price);}

【4】结构体指针

1. 概念:

指向结构体变量的指针称为结构体指针

2.定义格式:

​ struct 结构体名 *结构体指针名;
​ 应用:

   struct phone{int id;         //编号char brand[10]; //品牌char mod[20];   //型号char cpu[20];   //处理器float price;    //价格}ph_arr[5];struct phone *p = ph_arr;访问形式:(*p).id = 1001;p->id = 1001;


练习:打印功能选项,由用户进行功能选择,
​ 例如:输入1,进行手机信息录入。
​ 输入2,进行手机信息打印。
​ 输入6,退出系统。

【5】共用体

1. 概念:

不同数据类型的数据使用共同的存储区域,这种数据构造类型称为共用体,又称联合体。

2. 定义格式:

​ union 共用体名
​ {
​ 成员列表;
​ };
​ 例如:

  union data{char  cval;int   ival;float fval;};

3.共用体类型变量定义:

(1)先定义共用体类型,后定义变量。

    union data{char  cval;int   ival;float fval;};union data a,b,c;
(2)定义共用体类型的同时定义变量。

    union data{char  cval;int   ival;float fval;}a,b,c;如果不再定义新的变量,也可以将共用体的名字省略:union{char  cval;int   ival;float fval;}a,b,c;

4.共用体大小计算:

​ 结构体占用内存大于等于所有成员占用内存的总和,因为成员之间可能存在空隙,而共用体占用的内存空间,等于最大的成员变量占用的内存。
​ 共用体采用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,会覆盖掉原有的成员数据。
​ 比如 :共用体data里占用内存最大的是int类型数据,占用4个字节,那么共用体data占用的内存大小为4。


union test
{char s[20];int b;double c;
}a;
sizeof(a) = 20;通过共用体验证大小端:
#include<stdio.h>
union test
{char a;int b;
}num;
int main(int argc, const char *argv[])
{num.b = 0x12345678;printf("%#x\n",num.a);​    return 0;
}

【5】枚举:

1.定义:

只能取预先定义值的数据类型是枚举类型。

2.格式:

enum 枚举类型名
{
枚举元素列表
};
例如: 列出一个星期有几天:
enum week
{
Mon, Tues, Wed, Thurs, Fri, Sat, Sun
};
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,
因为枚举值默认从0开始,往后逐个加1,也就是说,week 中的 Mon、Tues … Sun
对应的值分别为 0、1 … 6。

​ 我们也可以给每个名字都指定一个值:

   enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };由于枚举类型值逐个递增1,我们也可以只给第一个名字指定一个值:enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

说明: 1)枚举类型是一种类型,通过它可以定义枚举变量
enum week a,b,c;
2)可以将列表里的值赋给枚举变量
enum week a = Mon, b = Web, c = Sat;
3)枚举列表中的Mon、Tues、Wed这些标识符的作用范围是全局的(严格来说是 main() 函数内部)
不能再定义与他们名字相同的变量。
4)Mon、Tues、Wed等都是常量,不能再次赋值,只能将他们赋给其他变量。
示例:判断用户输入的是星期几。

#include <stdio.h>int main(){enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;scanf("%d", &day);switch(day){case Mon: puts("Monday"); break;case Tues: puts("Tuesday"); break;case Wed: puts("Wednesday"); break;case Thurs: puts("Thursday"); break;case Fri: puts("Friday"); break;case Sat: puts("Saturday"); break;case Sun: puts("Sunday"); break;default: puts("Error!");}   return 0;}

九、结构体共用体枚举相关推荐

  1. c语言结构体共用体枚举实例程序,10-C语言结构体-共用体-枚举

    结构体是什么? 结构体和数组一样属于构造类型 数组是用于保存一组相同类型数据的,而结构体是用于保存一组不同类型的数组 定义结构体 在使用结构体之前必须先定义结构体类型,因为C语言不知道你的结构体中需要 ...

  2. c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)

    瘋子C语言笔记(结构体/共用体/枚举篇) (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student ...

  3. c语言 结构体 选择题,C语言结构体共用体选择题(新).doc

    C语言结构体共用体选择题(新).doc 1.变量a所占的内存字节数是.(假设整型int为4字节) struct stu char name20; long int n; int score4; a ; ...

  4. c语言 结构体 选择题,c语言结构体共用体选择题新

    <c语言结构体共用体选择题新>由会员分享,可在线阅读,更多相关<c语言结构体共用体选择题新(9页珍藏版)>请在人人文库网上搜索. 1.假 设整 型 int 为 4 字节)1.变 ...

  5. C语言程序设计 细节总结(第9章 结构体共用体枚举)

    第9章 结构体.共用体.枚举 9.1 结构体 1.对于同类型结构体变量之间可以整体一次赋值 9.2 指向结构体的指针 9.2.1结构体变量的指针 1.定义格式:struct 结构体名 *结构体指针变量 ...

  6. java jni 结构体_JNI基础 -- C++基础知识(结构体共用体 )

    结构体 类似于Java中的Bean对象,可以将一些变量封装为一个结构体 声明结构体的关键字是struct,也可以通过typedef别名定义 举个栗子: struct Student { //不同的数据 ...

  7. 中国大学慕课 大连理工大学 C语言程序设计 第11周 结构与共用体

    1 某班有5名同学,建立一个学生的简单信息表,包括学号.姓名.3门课程的成绩,编写程序,计算每名学生的平均成绩及名次.(30分) 题目内容: 某班有5名同学,建立一个学生的简单信息表,包括学号.姓名. ...

  8. 结构体、共用体、位操作和枚举类型

    1 引言 ● 结构体(Structure)[在C标准中有时也称为聚合体(Aggregate)]是统一在同一个名字之下的一组相关变量的集合,它可以包含不同类型的变量 ● 结构体通常用来定义储存在文件中的 ...

  9. C语言集锦 | 03 - C语言的复合数据类型(typedef关键字、结构体、枚举体、共用体)

    文档版本 更新时间 更新内容 v1.0 2020-09-14 初稿完成 文章目录 一.typedef关键词 二.结构体(重点) 1. 为什么需要结构体 2. 什么是结构体 3. 如何定义结构体 4. ...

最新文章

  1. 微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣
  2. dell存储Linux配置,Dell MD3200远程存储的特殊配置
  3. 百度无人驾驶出租长沙开测:Apollo技术一汽红旗车队,年内服役
  4. 开发shell脚本检查Nginx实战分享
  5. Promise的链式调用三种写法,Promise.all与式调用
  6. 【题集】牛客网·2018年全国多校算法寒假训练营练习比赛(第二场)
  7. 链式添加_涂料导电炭黑添加量
  8. 开户银行的现代化支付行号CNAPS查询
  9. CAD2017下载AutoCAD2017下载安装详细教程
  10. Linux 自动挂载U盘 实现热插拔
  11. clock skew detected on
  12. nginx resolver失败
  13. 2023年整理:吉利车机安装安装第三方软件教程,笔记本或手机操作方法!
  14. A Deep Learning-Based Remaining Useful Life Prediction Approach for Bearings 基于深度学习的轴承剩余寿命预测
  15. PWorld2016大会演讲PPT+访谈视频大合集,总有一款是你在找的!
  16. 清理docker的overlay2日志释放磁盘空间
  17. 数据结构——停车场管理系统
  18. 智能打印SDK---官方博客
  19. 奋斗吧,程序员——第五十三章 万里赴戎机,关山度若飞
  20. 教师学计算机内容包括哪些,中学计算机教师类论文参考文献 中学计算机教师核心期刊参考文献有哪些...

热门文章

  1. c语言来自不兼容指针类型的分配,c - 为什么我会收到“警告:来自不兼容指针类型的分配”? 结构数组中的双链表 - 堆栈内存溢出...
  2. java动态生成pdf文件的方法
  3. Mac 版 Vysor 1.8.2破解 以及下载
  4. 高效学习的4种方法,提升你的职场竞争力
  5. sigaction函数中关于sa_mask的解释
  6. 最全的运营数据指标解读
  7. 月薪从11k到44k,一个普通程序员的三年涨薪之路...
  8. 两万块钱闯非洲,他拿下联合国大项目,还把中国路灯卖到军营
  9. 60个有用的css代码片段
  10. 增量表、全量表和拉链表