C语言——结构体和共用体

A1.结构体类型的定义方式

“struct”是关键字,用于表明这是在定义结构体。结构体名用于标识该结构体。成员列表则具体规定了结构体包含的各个成员及其数据类型。通过三种方式定义结构体类型变量,分别为先声明结构体类型再定义、声明类型同时定义变量、不指定类型名直接定义结构体类型变量,这些方式提供了灵活的定义方式以满足不同的编程需求。

  1. strct 结构体名
  • {成员表列}
  • 关键字struct和结构体二者组合
  1. 3钟方式定义结 构体类型变量
    • 先声明结构体类型再定义类型变量名
      • strct student student1,student2;
    • 声明类型的同事定义变量
        • struct 结构体名
        • {成员列表}变量名表列
          • 例如
            • struct student
            • {成员表列
            • }student1,student2;
    • 不指定类型名直接定义结构体类型变量
      • struct
      • {成员表列
      • }变量名表列

A2.结构体类型变量的引用

通过“.”运算符可以方便地访问结构体变量中的各个成员。如果成员本身又是结构体类型,就需要多级“.”运算符来逐步访问到最底层的成员。结构体变量的成员可以像普通变量一样进行运算,并且同类结构体变量之间可以互相赋值。但不能直接对结构体变量进行整体输出。同时,可以引用结构体变量成员和结构体变量的地址。

  1. 引用结构体变量中成员的值
  • 结构体变量名.成员名
    • "."是成员(分量)运算符,所有运算符中优先级最高,
  1. 成员要是本身属于一个结构体类型,则要用多个成员运算符,一级一级找到最低一级的成员,且只能对最低级的成员进行赋值,存储,运算
    • 例如
      • student1.birthday.month
  1. 对结构体变量的成员可以像普通变量一样进行各种运算
  2. 同类的结构体变量可以互相赋值
    • 例如
      • stduent1=student2;
    • 不能将一个结构体变量进行整体输出
  1. 可以引用结构体变量成员和结构体变量的地址

A3.结构体数组

当需要处理多个结构体数据时,结构体数组就派上用场了。定义结构体数组时明确结构体名、成员列表以及数组长度。可以先声明结构体类型,然后再定义结构体数组。还可以在定义数组时进行初始化,方便设置初始值。

  • 一个结构体变量可以存放一组数据,多个数组需要参与运算,则需要用到数组,这就是结构体数组
  1. 定义结构体数组一般形式
    • struct 结构体名
    • {成员表列}数组名【数组长度】;
  • 声明一个结构体类型,再用此类型定义结构体数组
    • 结构体类型 数组名【数组长度】;
  1. 在定义数组的后面加上:={初值别列} (对结构化数组初始化)

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”分配的内存,避免内存泄漏。

  1. malloc(m)函数
  • 分配m字节长度的地址空间,并返回这段空间的首地址
    • int *p;
    • p=malloc(10*sizeof(int));
  1. free(p)函数
  • 释放指针p所指变量的存储空间,彻底删除一个变量

A6.用指针处理链表

链表是一种动态的数据结构,由头指针和各个节点组成。节点包含实际数据和指向下一个节点的指针。通过指针可以方便地操作链表,进行添加、删除等操作。

  1. 线型链表是动态地进行存储分配的一种数据结构
  • 链表的组成
    • 头指针:存放一个地址,该地址指向一个元素
    • 结点:用户需要的实际数据和链接节点的指针

A7.共用体类型

  1. 使几个不同的变量共占同一段内存的结构称为“共用体”类型
  2. 定义共用体类型变量的一般形式:
    • union 共用体名
    • {
    • 成员表列
    • }变量表列;
  1. 共用体和结构体的比较
  • 结构体变量所占内存长度是各成员站的内存长度之和。每个成员分别占其自己的内存单元
  • 共用体变量所占的内存长度等于最长的成员长度

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;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值