当前位置: 首页 > web >正文

自定义类型-结构体(一)

自定义类型

是程序员根据需求自己定义的数据类型,用于更灵活地组织和管理数据

C语言自带的类型无法描述一些复杂的对象

这时引用的自定义类型来进行描述

自定义类型具有:结果体,联合体,枚举三中自定义类型

特性基础类型自定义类型
定义语言内置(如intchar程序员自行定义(如structenum
复杂度单一值可包含多个成员或逻辑关系
内存占用固定大小(如int占4字节)由成员决定(如结构体各成员之和)
用途存储简单数据表示复杂数据或业务逻辑

结构体

结构体的定义

结构体定义的本质是创建一个新类型描述该类型具有的属性

struct [结构体名称] {数据类型 成员名;数据类型 成员名;  成员声明的语法:数据类型 成员名// ... 更多成员
} [变量名];     变量名表示创建了一个该类型的变量,也可以不在末尾创建变量,在后续过程中进行创建结构体的定义,只单纯的描述这个类型具有的属性有哪些,并不能直接使用需要创建变量对变量进行初始化才能使用该类型
// 定义结构体类型
struct Student {char name[20];int age;float score;
} stu1,stu2;   stu1,stu2表述创建了两个名为stu1,stu2的struct Student类型的变量

匿名结构体

 是指在定义结构体时不指定结构体标签(没有结构体名称)

struct {数据类型 成员名;数据类型 成员名;  // ... 更多成员
} [变量名];
匿名结构体的定义,在末尾必须定义至少一个变量
否则后续将因为没有类型而无法使用

结构体的初始化

顺序初始化
struct Student {char name[20];int age;float score;
}; 按照结构体定义的成员变量的顺序进行定义
struct Student stu1 = {"Alice", 20, 95.5};  直接访问指定初始化
方法1
struct Student stu2 = {.age = 22,.name = "Bob",   在进行指定初始化时,必须使用点操作符.score = 88.0    成员变量后接的是 逗号 而不是 分号
};
方法2
struct Student stu1 = {age = 22,name = "Bob",score = 88.0};

当结构体内嵌套一个结构体时

struct Student {          内层结构体int age;float score;
};                  
struct Student stu2 = {   外层结构体int age;char name;struct Student a;};
int main ()
{                                         嵌套访问struct Student stu2 b ={ 20,"李明",{ 19 , 70 } };  
}                           对嵌套在结构体内的结构体初始化时,要在花括号内在开一个花括号对嵌套在内的结构体的成员变量逐一初始化

匿名结构体初始化

匿名结构体必须在定义时直接声明变量并初始化,否则无法在后续代码中使用

// 定义匿名结构体并初始化变量 point
struct { int x; int y; 
} point = {10, 20}; // 顺序初始化// 指定成员初始化(C99+)
struct { int width; int height; 
} rect = { .width = 100, .height = 200 
};
特性匿名结构体普通结构体
类型名无(无法复用类型)有(通过 struct 标签名 或 typedef 别名复用)
变量声明时机必须在定义时声明变量可后续声明变量(如 struct Point p;
嵌套初始化语法可直接访问成员,无需外层结构体名(见示例)需通过外层结构体名访问(如 outer.inner.x
动态初始化只能通过复合字面量或指针间接实现可直接声明变量后赋值或动态分配内存
代码复用性低(单次使用)高(可多次声明变量)

结构成员访问

结构体成员的访问是通过点操作符( . )来完成的

匿名结构体的访问与普通结构体访问的方式一致

直接访问
struct p {         int x;int y;
};  
printf("x %d y %d\n", p.x, p.y)在printf中p表示要访问的结构体的名称点操作符后面的内容表示要访问的成员变量
嵌套访问
struct Student {          内层结构体int age;float score;
};                  
struct Student stu2 = {   外层结构体int age;char name;struct Student a;};
int main ()
{                                         嵌套访问struct Student stu2 b ={ 20,"李明",{ 19 , 70 } };  
}  
指针访问结构体
struct Book {char title[50]; 定义书的结构体float price;
};int main() {  // 通过指针访问成员strcpy(book->title, "C Programming"); 语法:结构体标识名->要初始化的成员变量 ,初始化的值book->price = 99.9;}
场景匿名结构体普通结构体
直接访问成员变量名.成员变量名.成员
嵌套访问成员直接通过外层变量访问:外层变量.成员需通过中间结构体名:外层变量.内层变量.成员
指针访问成员指针->成员指针->成员
动态分配后访问与普通结构体一致与匿名结构体一致

结构体的自引用

是指一个结构体( struct)内部包含一个指向 自身类型的指针。这种特性常用于实现链表、树、图等动态数据结构
struct Node {int data;             数据域struct Node* next;    自引用:指向同类型的指针
};                   struct Node* next 表示 next 是一个指向 struct Node 类型的指针

http://www.xdnf.cn/news/5229.html

相关文章:

  • 【Rust】枚举和模式匹配
  • 2025年数维杯赛题C题专家 组委会C题专家疑集锦
  • 5.8线性动态规划2
  • SpringMVC-执行流程
  • 40、C# 数组、链表、哈希、队列、栈数据结构的特点、优点和缺点
  • AI:生成对抗网络(GAN)
  • 【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用
  • yocto的大致工作流程
  • CSS渲染性能优化
  • MySQL进阶篇2_SQL优化、锁
  • 探索 JWT(JSON Web Token):原理、结构与实践应用对比
  • RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
  • C# 使用 WinUI 3 项目模板创建桌面应用程序
  • 在 Kubernetes 中使用 Docker 实现 GPU 支持的完整方案
  • Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程
  • 添加物体.
  • 2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业​​认证
  • 用jsp简单实现C语言标准化测试系统
  • (2025)图文解锁RAG从原理到实操
  • DeepSeek:开启物流行业创新变革新时代
  • 高效Python开发:uv包管理器全面解析
  • LeetCode热题100 两数之和
  • SAN 对抗网络搜索,搜索—智能编程—仙盟创梦IDE
  • 手机银行怎么打印流水账单(已解决)
  • vue访问后端接口,实现用户注册
  • MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
  • 居然智家亮相全零售AI火花大会 AI大模型赋能家居新零售的进阶之路
  • springCloud/Alibaba常用中间件之Nacos服务注册与发现
  • 第7次课 栈A
  • 腾讯云低代码实战:零基础搭建家政维修平台