A1.结构体类型的定义方式
“struct”是关键字,用于表明这是在定义结构体。结构体名用于标识该结构体。成员列表则具体规定了结构体包含的各个成员及其数据类型。通过三种方式定义结构体类型变量,分别为先声明结构体类型再定义、声明类型同时定义变量、不指定类型名直接定义结构体类型变量,这些方式提供了灵活的定义方式以满足不同的编程需求。
- strct 结构体名
- {成员表列}
- 关键字struct和结构体二者组合
- 3钟方式定义结 构体类型变量
-
- 先声明结构体类型再定义类型变量名
- strct student student1,student2;
- 声明类型的同事定义变量
-
- struct 结构体名
- {成员列表}变量名表列
- 例如
- struct student
- {成员表列
- }student1,student2;
- 例如
-
- 不指定类型名直接定义结构体类型变量
- struct
- {成员表列
- }变量名表列
- 先声明结构体类型再定义类型变量名
A2.结构体类型变量的引用
通过“.”运算符可以方便地访问结构体变量中的各个成员。如果成员本身又是结构体类型,就需要多级“.”运算符来逐步访问到最底层的成员。结构体变量的成员可以像普通变量一样进行运算,并且同类结构体变量之间可以互相赋值。但不能直接对结构体变量进行整体输出。同时,可以引用结构体变量成员和结构体变量的地址。
- 引用结构体变量中成员的值
- 结构体变量名.成员名
- "."是成员(分量)运算符,所有运算符中优先级最高,
- 成员要是本身属于一个结构体类型,则要用多个成员运算符,一级一级找到最低一级的成员,且只能对最低级的成员进行赋值,存储,运算
-
- 例如
- student1.birthday.month
- 例如
- 对结构体变量的成员可以像普通变量一样进行各种运算
- 同类的结构体变量可以互相赋值
-
- 例如
- stduent1=student2;
- 不能将一个结构体变量进行整体输出
- 例如
- 可以引用结构体变量成员和结构体变量的地址
A3.结构体数组
当需要处理多个结构体数据时,结构体数组就派上用场了。定义结构体数组时明确结构体名、成员列表以及数组长度。可以先声明结构体类型,然后再定义结构体数组。还可以在定义数组时进行初始化,方便设置初始值。
- 一个结构体变量可以存放一组数据,多个数组需要参与运算,则需要用到数组,这就是结构体数组
- 定义结构体数组一般形式
-
- struct 结构体名
- {成员表列}数组名【数组长度】;
- 声明一个结构体类型,再用此类型定义结构体数组
- 结构体类型 数组名【数组长度】;
- 在定义数组的后面加上:={初值别列} (对结构化数组初始化)
A4.结构体指针
结构体指针指向结构体或结构体数组元素。通过“结构体变量.成员名”“(*p).成员名”“p->成员名”这三种方式都可以访问结构体指针所指向的结构体变量的成员。使用指针可以更灵活地操作结构体数据,并且可以利用动态内存分配函数“malloc”和释放函数“free”来管理内存。
- 指向结构体数组的指针,结构变量的起始地址就是结构体变量的指针
- 指针变量可以指向结构体变量,结构体数组元素(指针变量的基类型必须与结构体变量类型相同)
- 例如
- struct student pt;
- pt可以指向struct student类型数据
- 例如
- C允许把(*p).num改成p->num,表示p所指向的结构体变量num成员
- p指向一个结构体变量3钟方式
- 结构体比变量.成员名
- (*p).成员名
- p->成员名
A5.指针实现动态内存分配
“malloc”函数根据指定的字节数分配内存空间并返回首地址。通过指针接收这个地址后,就可以操作这块分配的内存。而“free”函数用于释放由“malloc”分配的内存,避免内存泄漏。
- malloc(m)函数
- 分配m字节长度的地址空间,并返回这段空间的首地址
- int *p;
- p=malloc(10*sizeof(int));
- free(p)函数
- 释放指针p所指变量的存储空间,彻底删除一个变量
A6.用指针处理链表
链表是一种动态的数据结构,由头指针和各个节点组成。节点包含实际数据和指向下一个节点的指针。通过指针可以方便地操作链表,进行添加、删除等操作。
- 线型链表是动态地进行存储分配的一种数据结构
- 链表的组成
- 头指针:存放一个地址,该地址指向一个元素
- 结点:用户需要的实际数据和链接节点的指针
A7.共用体类型
- 使几个不同的变量共占同一段内存的结构称为“共用体”类型
- 定义共用体类型变量的一般形式:
-
- union 共用体名
- {
- 成员表列
- }变量表列;
- 共用体和结构体的比较
- 结构体变量所占内存长度是各成员站的内存长度之和。每个成员分别占其自己的内存单元
- 共用体变量所占的内存长度等于最长的成员长度
A8.枚举类型
共用体让不同的变量共享同一段内存,与结构体不同的是,共用体变量所占内存长度是最长成员的长度,而不是各成员内存长度之和。共用体和结构体在内存使用和数据存储方式上有明显区别。
- 一个变量只能几种可能的值,则可以定义为枚举类型。
- 声明枚举类型用enum
- 例如
- enum weekday{sun,mon,tue,----xx}
- 例如
- 定义变量
- enum weekday workday;
- enum{sun,mon,tue,wed,thu,fri,sat}workday;
- 枚举值是常量,不是变量,不能被赋值
- 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量
- workday=sat y
- workday=6 x
A9.类型定义符typedef
它为已有的数据类型取一个新的别名,方便代码编写和理解。可以使用“typedef”为各种数据类型包括基本类型、结构体类型等定义新名字,使代码更具可读性和可维护性
- 类型定义符typedef用来为数据类型取“别名”
- 一般形式
- typedef 原类型名 新类型名
- 例如
- typedef int INTERGER;
- INTERGER a,b;
- 等价于:int a,b;
- 例如
- typedef 原类型名 新类型名