c语言基础 —— 结构体、共用体、枚举、宏定义

9、结构体

9.1、为什么需要结构体?

没有结构体之前,在C语言中,数据的组织依靠:变量+数组。
最初最简单的时候,只需要使用基本数据类型(int char float double)来定义单个变量,需要几个变量就定义几个。
后来情况变复杂了,有时需要很多意义相关的变量(譬如需要存储及运算一个班级的学生分数)这时候数组出现了。数组解决了需要很多类型相同、意义相关的变量的问题。
但是数组是有限制的。数组最大的不足在于,一个数组只能存储很多个数据类型相同的变量。
所以碰到需要封装几个类型不同的变量的时候,数组就无能为力。
**譬如对于题目:使用一个数据结构来保存一个学生的所有信息:姓名 学号 性别
这时候就需要结构体。(c语言默认无布尔类型)
无符号整数用来表示编号

9.2、什么是结构体?

结构体是一个集合,集合中包含很多个元素,这些元素的数据类型可以相同,也可以不相同。 所以结构体是一种数据封装的方法。结构体存在的意义就在于,**把很多数据类型不相同的变量封装在一起,组成一个大的新的数据类型。

数据结构:把庞大复杂的数据用一定的方式组织管理起来,便于操作(查找,增加,删除等)这就叫数据结构。
在这里插入图片描述

9.3、结构体和数组的关联:

数组是一种特殊的结构体,特殊之处在于封装内的各个元素类型是相同的。 结构体和数组都是对一些子元素的封装,因此定义的时候都是封装作为整体定义,但是**使用的时候,都是使用封装中的子元素。一般结构体变量和数组变量都不会作为一个整体操作。
在这里插入图片描述

效果一样

9.4、使用结构体的步骤:

第一步:定义结构体类型。结构体类型的定义是在函数外面(函数外面 == 全局)的
第二步:使用第一步定义的类型来定义结构体变量。
第三步:使用变量。实际上使用结构体变量的时候,使用的是结构体变量中封装的各个子元素,而不是结构体变量本身。

9.5、结构体的初始化

结构体变量和普通变量一样,作为局部变量时,如果**定义的时候无初始化也无显式赋值,则结构体变量中的子元素的值是随机的。
在这里插入图片描述
在这里插入图片描述

发现2种C语言接受的结构体初始化方式。
第一种,完全初始化。{xx, xx, xx, xx, xx};
在这里插入图片描述

错误示范:
在这里插入图片描述
在这里插入图片描述

第二种,部分初始化。
定义同时初始化(常用)
{
.a = xx,
.b = xx,
.c = xx,
.d = xx,
};
![[Pasted image 20220813165906.png]]

错误示范:
在这里插入图片描述

新增关键字: struct
新增操作符: .

double %lf,%f(fload)
char %c,%d
string %s

10、宏定义

#define N 321 //宏定义的格式 N就是宏 (不成熟,不用这个,有可能出错)
![[Pasted image 20220813201057.png]]

321 的数据不是很复杂,所以没有括号起来,其实严格点要用()括起来

**标准格式: #define 宏名 (数值) (用这个)
在这里插入图片描述

宏定义要注意的问题:
1、宏定义一般是在函数的外面
2、宏定义必须要先定义(放在开头),再使用宏。如果先使用就会编译报错。
3、宏定义中宏名一般**用大写。不是语法规定的,是一般约定俗成的。
在这里插入图片描述

为什么使用宏定义?
在C语言中,一般使用常数的时候,都不是直接使用,而是先把该常数定义为一个宏,然后在程序中使用该宏名。这样做的**好处是,等我们需要修改这个常数时,只需要在宏定义处修改一次即可。而不用到代码中到处去寻找,看哪里都用过该常数。
在这里插入图片描述

在复杂的情况下,只要定义了一个就可以多次复用,而不用在没定义的情况要修改时一个一个找再修改多个数据

**面试题:

两个考点:

  • 加括号
  • UL 强制转换成无符号长整形 unsigned long int 因为该数超过了int的范围(或者U 无附数可以放得下)

在这里插入图片描述

11、枚举

选择分支:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样子还不会出错,但是当我们出现了不在该范围的数就错了,不能限制在里面

在这里插入图片描述

所以说,需要一个把范围限制住的方法,这时候就需要枚举

并且较宏定义封装起来,好看点,效果与宏定义是一样的

12、共用体(union,联合,联合体)(用在复杂的数据结构)

共用体union在定义和使用形式上,和结构体struct很相似。但是两种数据结构是完全不同的两类东西。
**结构体,是对多个数据的组合与封装。
共用体,共用体中只有一个东西,只是它被好几个名字(和类型)共用。不同的名字对应一个类型
在这里插入图片描述
在这里插入图片描述

a,b打印出来的一样
不像结构体一样如果没有初始化值会变成随机
在这里插入图片描述

char -128 ~ 127
在这里插入图片描述

char范围循环,超过127又回到-128

int -xxxx ~ + xxxx

新增关键字:union

union里面用了一个变量,其它的就不占用空间了

例子:
如下学生信息,若对应的是男孩则女孩的结构体就不会占用空间
在这里插入图片描述

使用共用体,性别要么是男,要么是女,是互斥的

而姓名啥的对应一个人是缺一不可的,在结构体中可以共存

基础知识:
1、double float用%f打印,char用%c和%d打印,int用%d,字符串用%s打印,指针用%p打印

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值