构造类型:
数据类型的分类:
- 基本类型:·整数型:短整型(short)、整型(int)、长整型(long)、长长整型(long long)
·浮点型:单精度浮点型(float)、双精度浮点型(double)
·字符型:char
(2)指针类型:·数据类型*:int*、char*、float*...·void*:任意数据类型的指针
(3)空类型:void:没有返回值或没有形参(不能定义变量)
(4)自定义类型/构造类型:·结构体类型:struct
·共用体类型(联合体):union
·枚举类型:enum
注意:整数型和字符型分为有符号(signed)和无符号(unsigned),默认是有符号,有符号 可以省略关键字signed
结构体:
·定义:自定义数据类型的一种,关键字struct,结构体类型的变量可以存储多个不同数据类型的数据
·定义格式:
注意:结构体中定义的变量称为成员变量
·格式说明:·结构体名:合法的标识符,建议单词首字母大写
·数据类型:C语言支持的所以类型
·成员名称:合法的标识符,就是变量的命名标准
·数据类型n 成员名称n:类似于定义变量,定义了结构体中的成员
·注意:
·结构体在定义的时候,成员不能赋值
·举例:
·常见的定义格式:(1)方式一:常规定义(只定义类型)---推荐
(2)方式二:定义匿名结构体(常用于作为其他结构体的成员使 用)
注意:定义匿名结构体的的同时必须定义结构体变量,否则编译报 错,结构体可以作为另一个结构体的成员。
总结:(1)结构体可以定义在局部位置,也可以定义在全局位置
(2)全局位置的结构体名和局部位置的结构体名可以相同, 就近原则(和普通变量的定义同理)
·结构体类型的使用:利用结构体类型定义变量,定义数组,结构体类型的使用与基本 数据类型的使用类似
结构体变量的定义:
·三种形式定义结构体变量:
(1) ①先定义结构体
②然后使用struct结构体名 变量名;
(2) 在定义结构体的同时,定义结构体变量;
此时定义了一个结构体A,x,y是这个结体类型的变量
(3)不推荐
在自定义匿名结构的同时,定义结构体变量:
此时定义了一个没有名字的结构体(称为匿名结构体),xy是这个匿名结构体的变量
说明:匿名结构体----弊大于利(尽量少用)
优点:少写一个结构体名称
缺点:只能使用一次,定义的结构体类型同时必须定义变量
应用场景:当结构体的类型只需要使用一次,并且定义类型的同时定义变量
作为其他结构体的成员使用
·定义结构体的同时,定义结构体变量初始化
结构体成员部分初始化时,大括号不能省略
如果赋值没有歧义,编译和运行就没有问题
如果赋值推导有歧义,编译就会报错
结构体的成员没有默认值,是不确定的数
结构体变量的使用:
·结构体变量访问结构体成员
·格式: 结构体变量名.成员名;
可以通过访问给成员赋值(存数据)
可以通过访问获取成员得到值(取数据)
·结构体变量未初始化,结构体的成员值随机(不确定)
·结构体变量在定义时,可以初始化(建议用大括号表明数据的范围、结构体成员可以部分初始化,部分初始化时一定要带大括号表明数据范围
结构体数组的定义:
·什么时候需要结构体数组?
比如:需要管理一个学生对象,只需要定义一个struct Student{..};
假如:需要管理多个学生对象,此时就需要一个结构体数组
·三种形式定义结构体数组
- 先定义结构体类型,然后定义结构体变量,再将变量存储到结构体数组中
- 定义结构体类型,然后定义结构体数组并初始化
- 定义结构体类型同时定义结构体数组并初始化
- 定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值
结构体指针:
·定义:结构体类型的指针变量指向结构体变量或数组的起始地址
·语法:struct结构体名*指针变量列表;
·结构体成员访问:(1)结构体数组名访问结构体成员·格式:结构体数组名 ->成员名;
(2)结构体成员访问符: .:做测试结构体变量(结构体对象/实例); 也可以叫做结构对象访问成员符;右侧是 结构体成员
->:左侧是一个指针,也可以叫结构体指针访 问成员符;;右侧是结构体成员
(3)访问结构体成员有两种形式,三种方式:
·类型一:通过结构体对象访问成员
·类型二:通过结构体指针访问成员
①指针引用访问成员
②指针解引用间接访问成员
③结构体数组中元素的访问
注意:
·结构体类型的使用案例:
结构体类型求大小:
·规则:字节对齐(数据在内存中存储在其类型大小的整数倍上)
·首先保证结构体中的成员存储在自身的对齐边界(类型大小的整数倍)
·在满足上面条件下,最终大小要满足最大成员所占存储单元的整数倍
·为什么要使用字节对齐:节省内存,提高访问效率
·柔性数组:柔性数组不占有结构体的大小
共用体/联合体类型:
·定义:使几个不同的百年来占用同一段内存的结构,共用体按定义中需要存储空间最大的 成员来分配存储单元,其他成员也是用该空间,他们的首地址是相同的
·定义格式
·共用体的定义和结构体类型的类似:(1)可以有名字,也可以匿名
(2)共用体在定义时也可以定义共用体变量
(3)共用在定义时也可以初始化成员
(4)共用体也可以作为形参和返回值类型使用
(5)共用体也可以定义共用体数组
...
也就是说结构体的语法,共用体都支持
·注意:(1)共用体弊大于利,尽量少用
- 共用体变量在某一时刻只能存一个数据,并且也只能取出一个数
- 共用体和结构体都是自定义数据类型,用法类似于基本数据类型
- 共用体可以是共用体的成员,也可以是结构体的成员
- 结构体可以是共用体的成员,也可以是共用体的成员
枚举:
·定义:我们一般情况下,定义常量使用宏定义(#define 宏名称 值),但是宏定义非常适 合没有关联关系的常量,但是有时候可能需要对一组拥有关系的量进行定义,比如 周一~周日,1月~12月等等,使用宏定义就不是很清晰,这个时候就需要使用枚举。
枚举的存在就是将多个拥有关联关系的常量组织到一起,提高代码的可读性
·说明:
枚举类型定义了一组常量,我们在开发中直接使用这些常量(常用)
当然枚举类型也可以类似于结构体一样定义变量等操作
枚举常量有默认值,从0开始一次加一,我们可以在定义是指定他的值,如果个别 没有赋值,可以根据值依次加一推导
·特点:
定义了一组常量,类似于定义了多个自定义常量(宏定义)
提高了代码的可读性(避免了魔术数字)
·语法:
typedef:
·说明:给类型重命名,不会影响到类型本身
·作用:给已有的类型起别名
·格式:
·应用场景:①数据类型复杂(结构体、共用体、枚举、结构体指针)时使用
②为了跨平台兼容性
例如:·size_t:类型重命名后的数据类型,typedef unsigned long size_t;
·unil_16:类型重命名后的数据