C语言 - 构造类型

构造类型:

数据类型的分类:

  1. 基本类型:·整数型:短整型(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{..};

假如:需要管理多个学生对象,此时就需要一个结构体数组

·三种形式定义结构体数组

  1. 先定义结构体类型,然后定义结构体变量,再将变量存储到结构体数组中

  1. 定义结构体类型,然后定义结构体数组并初始化

  1. 定义结构体类型同时定义结构体数组并初始化

  1. 定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值

结构体指针:

·定义:结构体类型的指针变量指向结构体变量或数组的起始地址

·语法:struct结构体名*指针变量列表;

·结构体成员访问:(1)结构体数组名访问结构体成员·格式:结构体数组名 ->成员名;

 (2)结构体成员访问符: .:做测试结构体变量(结构体对象/实例); 也可以叫做结构对象访问成员符;右侧是 结构体成员

                                 ->:左侧是一个指针,也可以叫结构体指针访 问成员符;;右侧是结构体成员

(3)访问结构体成员有两种形式,三种方式:

·类型一:通过结构体对象访问成员

·类型二:通过结构体指针访问成员

①指针引用访问成员

②指针解引用间接访问成员

③结构体数组中元素的访问

注意:

·结构体类型的使用案例:

结构体类型求大小:

·规则:字节对齐(数据在内存中存储在其类型大小的整数倍上)

·首先保证结构体中的成员存储在自身的对齐边界(类型大小的整数倍)

·在满足上面条件下,最终大小要满足最大成员所占存储单元的整数倍

·为什么要使用字节对齐:节省内存,提高访问效率

·柔性数组:柔性数组不占有结构体的大小

共用体/联合体类型:

·定义:使几个不同的百年来占用同一段内存的结构,共用体按定义中需要存储空间最大的    成员来分配存储单元,其他成员也是用该空间,他们的首地址是相同的

·定义格式

·共用体的定义和结构体类型的类似:(1)可以有名字,也可以匿名

                             (2)共用体在定义时也可以定义共用体变量

                             (3)共用在定义时也可以初始化成员

                             (4)共用体也可以作为形参和返回值类型使用

                             (5)共用体也可以定义共用体数组

                                     ...

也就是说结构体的语法,共用体都支持

·注意:(1)共用体弊大于利,尽量少用

  1. 共用体变量在某一时刻只能存一个数据,并且也只能取出一个数
  2. 共用体和结构体都是自定义数据类型,用法类似于基本数据类型
  3. 共用体可以是共用体的成员,也可以是结构体的成员
  4. 结构体可以是共用体的成员,也可以是共用体的成员

枚举:

·定义:我们一般情况下,定义常量使用宏定义(#define 宏名称 值),但是宏定义非常适 合没有关联关系的常量,但是有时候可能需要对一组拥有关系的量进行定义,比如 周一~周日,1月~12月等等,使用宏定义就不是很清晰,这个时候就需要使用枚举。

枚举的存在就是将多个拥有关联关系的常量组织到一起,提高代码的可读性

·说明:

枚举类型定义了一组常量,我们在开发中直接使用这些常量(常用)

   当然枚举类型也可以类似于结构体一样定义变量等操作

     枚举常量有默认值,从0开始一次加一,我们可以在定义是指定他的值,如果个别 没有赋值,可以根据值依次加一推导

·特点:

定义了一组常量,类似于定义了多个自定义常量(宏定义)

提高了代码的可读性(避免了魔术数字)

·语法:

 typedef:

·说明:给类型重命名,不会影响到类型本身

·作用:给已有的类型起别名

·格式:

·应用场景:①数据类型复杂(结构体、共用体、枚举、结构体指针)时使用

②为了跨平台兼容性

例如:·size_t:类型重命名后的数据类型,typedef unsigned long size_t;

·unil_16:类型重命名后的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值