惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
量子位
博客园 - 聂微东
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
GbyAI
GbyAI
MyScale Blog
MyScale Blog
IT之家
IT之家
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
The Register - Security
The Register - Security
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
雷峰网
雷峰网
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 叶小钗
D
DataBreaches.Net
B
Blog
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
腾讯CDC
T
Threat Research - Cisco Blogs
SecWiki News
SecWiki News
Martin Fowler
Martin Fowler
D
Docker
Cisco Talos Blog
Cisco Talos Blog
T
Tenable Blog
Webroot Blog
Webroot Blog
宝玉的分享
宝玉的分享

青空之蓝

[青空之蓝-2023] - 色彩 | 青空之蓝 [青空之蓝-2022] - 平静 | 青空之蓝 [青空之蓝-2021] - 远望 | 青空之蓝 浅谈垃圾回收 | 青空之蓝 浅谈泛型擦除 | 青空之蓝 浅谈单点登录 | 青空之蓝 使用 Kotlin 编写 Spring 测试 | 青空之蓝 设计模式系列文章 | 青空之蓝 从零实现一个 Java 微框架 - IoC | 青空之蓝 从零实现一个 Java 微框架 - 前言 | 青空之蓝 浅谈 JVM:类加载 | 青空之蓝 浅谈 IO | 青空之蓝 浅谈并发:synchronized & ReentrantLock | 青空之蓝 浅谈并发:CAS & AQS | 青空之蓝 浅谈并发:ThreadLocal | 青空之蓝 浅谈并发:三大特性 | 青空之蓝 浅谈组合注解 & 注解别名 | 青空之蓝 [青空之蓝-2020]-迷茫 | 青空之蓝 Java 系列文章 | 青空之蓝 HTTP 系列文章 | 青空之蓝 浅谈 EatWhatYouKill | 青空之蓝 浅谈可扩展线程池 | 青空之蓝 聊聊写框架 | 青空之蓝 聊聊现状-[2020-09] | 青空之蓝 浅谈并发:锁 | 青空之蓝 浅谈并发:基础 | 青空之蓝 浅谈缓存 | 青空之蓝 无须定义类,Spring 快速注入 Json 参数 | 青空之蓝 浅谈 Proxy 和 Aop | 青空之蓝 从零实现一个 PHP 微框架 - 初始化请求 | 青空之蓝 为 Vue3 添加一个简单的 Store | 青空之蓝 从零实现一个 PHP 微框架 - 服务提供者 | 青空之蓝 WSL2 踩坑记录 | 青空之蓝 浅谈浏览器Event Loop [更新] | 青空之蓝 从零实现一个 PHP 微框架 - Bootstrap 启动加载 | 青空之蓝 从零实现一个 PHP 微框架 - IoC 容器 | 青空之蓝 从零实现一个 PHP 微框架 - PSR & Composer | 青空之蓝 从零实现一个 PHP 微框架 - 前言 | 青空之蓝 MVVM 简单实现 | 青空之蓝 浅谈 DI 和 IoC | 青空之蓝 中间件实现 [PHP] | 青空之蓝 告别 Windows 终端的难看难用,打造好用的 PowerShell | 青空之蓝 VSCode Java输出中文乱码问题解决[更新] | 青空之蓝 浅谈浏览器渲染 | 青空之蓝 Vue-Cli@2 项目迁移日志 | 青空之蓝 Laragon & Scoop 集成踩坑记录 | 青空之蓝 「一行代码」优雅管理 Windows 软件 | 青空之蓝 [青空之蓝-2019]-年度总结 | 青空之蓝 为Vue添加简单的Store | 青空之蓝 为React添加简单的Store | 青空之蓝 为Vuex添加同步Action | 青空之蓝 浅谈B+树 | 青空之蓝 浅谈跳表 | 青空之蓝 浅谈数据库索引 | 青空之蓝 MySQL事务隔离 | 青空之蓝 算法复杂度分析(1) | 青空之蓝 一年来的经验总结 | 青空之蓝 Acrylic - VSCode Extension | 青空之蓝 ace编辑器设置惯性滚动 | 青空之蓝 Java二叉树实现 | 青空之蓝 Java图实现 | 青空之蓝 为apt方式安装的nginx重新编译增加WebDAV | 青空之蓝 XK-Editor - 一个支持富文本和Markdown的编辑器 | 青空之蓝 JS生成列表树 | 青空之蓝 Laravel生成目录树 | 青空之蓝 XK-Note - 集各种神奇功能的云笔记 | 青空之蓝 PHP GD生成验证码 | 青空之蓝 PHP GD图片处理[转换格式-水印-缩略图] | 青空之蓝 Origami - 简洁轻快的WordPress主题 | 青空之蓝 为WordPress启用WorkBox | 青空之蓝 [青空之蓝-2018]-年度总结 | 青空之蓝 VSCode Java手动导入jar和源码包 | 青空之蓝 Windows IP变化自动发送邮件 | 青空之蓝 C链表实现重制版 | 青空之蓝 图的搜索(遍历) - BFS & DFS | 青空之蓝 Java链表实现 | 青空之蓝 C 快速排序 | 青空之蓝 C 插入排序 | 青空之蓝 C 归并排序 | 青空之蓝 C语言链表实现 | 青空之蓝 VSCode配置Java调试环境[Windows] | 青空之蓝 C 选择排序 | 青空之蓝 C 冒泡排序 | 青空之蓝 VSCode配置PHP调试环境[Windows] | 青空之蓝 VSCode配置C/C++ GDB调试环境[Windows] | 青空之蓝 WordPress友情链接模板 | 青空之蓝 Intel Optane 傲腾内存体验 | 青空之蓝 Mysql双机热备实战 | 青空之蓝 博客一年记录 | 青空之蓝 为WordPress启用Service Worker | 青空之蓝 Bing每日一图API | 青空之蓝 iframe延迟加载 | 青空之蓝 写在2018年高考前 | 青空之蓝 The Fox主题汉化分享 | 青空之蓝 [青空之蓝-2017]-崭新 | 青空之蓝 本博客评论规则 | 青空之蓝 世界,您好! | 青空之蓝
C 结构体的定义和使用 | 青空之蓝
Otstar Lin · 2018-12-26 · via 青空之蓝

应同学请求更新了这篇文章,正好没有水文的借口 (逃

1.前言

在 C 语言中结构体指一种数据结构,是 C 语言中复合数据类型,结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。

与 Java 中的类类似一个结构体看可以看作是一个类别,某类事物的集合体,比如要表示一本书的各种属性(作者,页数,出版时间等),在没有使用结构体的时候,就需要使用各种基本数据类型进行存储,这时会发现在表示数据的时候乱七八糟的,调用的时候也不容易调用,但如果使用了结构体,那结构体名称就可以使用书名表示,书的各种属性就可以放在结构体中,在使用的时候可以很直观的用结构体名称(书名)调用

2.实践

定义结构

在使用结构体的时候需要定义结构体,可以不先定义结构体变量,但必须先定义好结构体的结构

struct tag {
    member-list
    member-list
    member-list
    ...
} variable-list ;
struct tag {
    member-list
    member-list
    member-list
    ...
} variable-list ;
  • tag : 结构体的标志,可以不设置,但是如果不设置就必须在定义时声明 variable-list,一般使用全大写表示,建议每个结构体都要有 tag
  • member-list : 结构中的成员,在定义的时候必须定义结构体中的所有成员
  • variable-list : 结构体变量列表,若不声明就必须要有 tag,可以声明多个,使用逗号隔开,也可声明结构体数组

定义时也可以使用 typedef 来创建一个数据类型,下面会针对这两种定义方式进行分析

typedef struct SIMPLE
{
    int a;
    char b;
    double c;
} Simple, *pSimple;
// 我比较喜欢使用这种方式,因为在定义时不需要添加struct,也和Java中的类更加相似
// 不同于结构体,上面三个都是必填项,最后一项不再代表结构体变量,而是代表数据类型
typedef struct SIMPLE
{
    int a;
    char b;
    double c;
} Simple, *pSimple;
// 我比较喜欢使用这种方式,因为在定义时不需要添加struct,也和Java中的类更加相似
// 不同于结构体,上面三个都是必填项,最后一项不再代表结构体变量,而是代表数据类型

嵌套结构体

// 指针式嵌套,可以嵌套自己也可以嵌套别的结构体,但必须声明
struct A
{
    struct B *partner;
    //other members;
};
// 普通嵌套
struct A
{
    struct B partner;
    //other members;
};
// 注意:若使用了typedef创建数据类型建议加上struct防止出现不必要的麻烦
// 指针式嵌套,可以嵌套自己也可以嵌套别的结构体,但必须声明
struct A
{
    struct B *partner;
    //other members;
};
// 普通嵌套
struct A
{
    struct B partner;
    //other members;
};
// 注意:若使用了typedef创建数据类型建议加上struct防止出现不必要的麻烦

声明结构体变量

结构体变量可以紧跟结构体后创建,不过由于结构体在函数外创建,所以紧跟结构体后声明的结构体变量是全局变量

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;
// 这时book就是结构体变量了,可以同基本数据类型一样使用了
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;
// 这时book就是结构体变量了,可以同基本数据类型一样使用了

还有一种是在函数中创建

struct Books book;
struct Books book;

使用 typedef 的创建

// 上面我们定义了SIMPLE这个结构体,在创建结构体变量时同基本数据类型一样
// 基本数据类型的定义
// int i;
// 使用typedef的结构体的定义
Simple i; //Simple是在定义结构体的结构时底下的variable-list中的一个
// 上面我们定义了SIMPLE这个结构体,在创建结构体变量时同基本数据类型一样
// 基本数据类型的定义
// int i;
// 使用typedef的结构体的定义
Simple i; //Simple是在定义结构体的结构时底下的variable-list中的一个

创建结构体指针

// 结构体指针在创建时一般会使用malloc来进行开拓内存
// 也可以不开拓,不开拓的话不能访问内部成员
struct Books *book =struct Books *malloc(sizeof(struct Books));
// 使用了typedef的结构体创建方式
pSimple sim = (pSimple)malloc(sizeof(Simple)); // 注意定义中pSimple前有一个*,代表结构体指针类型
// 结构体指针在创建时一般会使用malloc来进行开拓内存
// 也可以不开拓,不开拓的话不能访问内部成员
struct Books *book =struct Books *malloc(sizeof(struct Books));
// 使用了typedef的结构体创建方式
pSimple sim = (pSimple)malloc(sizeof(Simple)); // 注意定义中pSimple前有一个*,代表结构体指针类型

访问结构体成员

创建好了结构体变量后才能进行访问

// 访问普通的结构体
name.member1
name.member2
// 访问结构体指针中的成员,前提是结构体指针有使用malloc进行创建,否则会报错
name->member1
name->member2
// 结构体数组
name[0].member
name[0]->member
// 访问普通的结构体
name.member1
name.member2
// 访问结构体指针中的成员,前提是结构体指针有使用malloc进行创建,否则会报错
name->member1
name->member2
// 结构体数组
name[0].member
name[0]->member

3.结语

结构体是 C 语言和多种类 C 语言中的一种数据结构,在 Golang,C#,C++都有结构体,但是除了 Golang,其它两种语言都支持面向对象,所以一般很少用到,但是在 C 中它是非常重要的,。。。。。。。。。编不下去了( ̄ ▽  ̄)" (逃

C 结构体的定义和使用

https://blog.ixk.me/post/definition-and-use-of-the-c-struct
  • 许可协议

    BY-NC-SA

  • 本文作者

    Otstar Lin

  • 发布于

    2018/12/26

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

C链表实现重制版图的搜索(遍历) - BFS & DFS