【C语言从入门到放弃 4】字符串,结构体,共用体,位域,typedef详解
C语言是一种广泛应用于系统编程和嵌入式开发的高效编程语言。在本文中,我们将介绍C语言中的一些重要概念,包括字符串、结构体、共用体、位域和typedef,并提供简单的示例代码。
字符串
在C语言中,字符串是以空字符('\0')结尾的字符数组。我们可以使用字符数组来表示字符串,并通过一系列标准库函数来处理字符串。以下是一个简单的字符串示例:
#include <stdio.h>int main() {char str[] = "Hello, world!";printf("The string is: %s\n", str);return 0;
}
上述代码中,我们声明了一个名为str的字符数组,并将字符串"Hello, world!"赋值给它。然后,我们使用printf函数打印出字符串的值。输出结果为"The string is: Hello, world!"。
结构体
结构体是C语言中用于存储不同数据类型的集合。通过结构体,我们可以定义自定义的复合数据类型,方便地组织和访问相关的数据。以下是一个简单的结构体示例:
#include <stdio.h>struct Student {int id;char name[20];float score;
};int main() {struct Student s = {1, "Alice", 95.5};printf("Student ID: %d, Name: %s, Score: %.1f\n", s.id, s.name, s.score);return 0;
}
上述代码中,我们定义了一个名为Student的结构体,包含学生的ID、姓名和分数。然后,在main函数中,我们声明了一个结构体变量s,并初始化它的值。最后,我们使用printf函数打印出学生的信息。
共用体
共用体是一种特殊的数据类型,它允许在同一内存位置存储不同的数据类型。共用体的大小取决于其成员中最大的数据类型。以下是一个简单的共用体示例:
#include <stdio.h>union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10;printf("Data i: %d\n", data.i);data.f = 3.14;printf("Data f: %.2f\n", data.f);return 0;
}
上述代码中,我们定义了一个名为Data的共用体,包含整数、浮点数和字符数组。在main函数中,我们声明了一个共用体变量data,并分别给不同的成员赋值。输出结果为"Data i: 10"和"Data f: 3.14"。
位域
位域是C语言中一种用于节省内存的技术,它允许在一个字节中存储多个字段。通过位域,我们可以定义结构体成员的位数,并有效地利用内存空间。
常见用法和注意事项:
-
节省内存空间:位域允许我们在一个字节中存储多个字段,这样可以有效地节省内存空间。在一些资源受限的嵌入式系统中,特别需要节省内存时,位域可以发挥重要作用。
-
位域成员的位数:位域成员的位数不能超过其所属数据类型的位数。例如,一个char类型的位域成员最多只能有8位。
-
位域成员的顺序:位域成员的顺序是由编译器决定的,可能会受到编译器的优化影响。因此,在使用位域时,需要确保位域的顺序和位数符合预期。
-
位域的可移植性:由于位域的布局和顺序依赖于编译器的实现,因此在不同的编译器和平台上,位域的行为可能会有所不同。因此,需要谨慎使用位域,尤其是在编写需要在不同平台上移植的代码时。
以下是一个简单的位域示例:
#include <stdio.h>struct Bits {unsigned int flag1 : 1;unsigned int flag2 : 2;unsigned int flag3 : 3;
};int main() {struct Bits bits;bits.flag1 = 1;bits.flag2 = 3;bits.flag3 = 5;printf("Flags: %d %d %d\n", bits.flag1, bits.flag2, bits.flag3);return 0;
}
上述代码中,我们定义了一个名为Bits的结构体,包含三个位域成员。在main函数中,我们声明了一个结构体变量bits,并给不同的位域成员赋值。输出结果为"Flags: 1 3 5"。
typedef
typedef是C语言中用于创建新的数据类型名称的关键字。通过typedef,我们可以为现有的数据类型定义别名,提高代码的可读性和可维护性。以下是一个简单的typedef示例:
#include <stdio.h>typedef struct {int year;int month;int day;
} Date;int main() {Date d = {2021, 10, 1};printf("Today's date: %d-%d-%d\n", d.year, d.month, d.day);return 0;
}
上述代码中,我们使用typedef为结构体定义了一个别名Date。然后,在main函数中,我们声明了一个Date类型的变量d,并初始化它的值。最后,我们使用printf函数打印出日期信息。
typedef VS #define
它们有以下不同点:
-
作用范围:#define用于创建常量宏,可以用于定义常量、函数宏等,作用范围是整个程序。而typedef用于创建类型别名,可以用于定义新的数据类型名称,作用范围是在类型声明中。
-
替换方式:#define是在预处理阶段将标识符替换为指定的文本,不关心数据类型,只是简单的文本替换。而typedef是在编译阶段定义新的数据类型名称,关联到具体的数据类型。
-
数据类型:#define并不关心数据类型,它可以用于定义任何类型的常量或宏,包括常量、字符串、函数宏等。而typedef主要用于创建新的数据类型名称,例如结构体、枚举、指针等。
下面是一个简单的示例来展示typedef和#define的不同用法:
#include <stdio.h>// 使用#define定义常量宏
#define PI 3.14159// 使用typedef创建类型别名
typedef struct {int year;int month;int day;
} Date;int main() {// 使用#define定义的常量宏double radius = 5.0;double area = PI * radius * radius;printf("Circle area: %f\n", area);// 使用typedef创建的类型别名Date today = {2021, 10, 1};printf("Today's date: %d-%d-%d\n", today.year, today.month, today.day);return 0;
}
在上述示例中,我们使用#define定义了常量宏PI,用于表示圆周率;同时使用typedef创建了类型别名Date,用于表示日期。通过这个示例,可以看到#define和typedef的不同用法和作用范围。
总之,#define用于定义常量宏,而typedef用于创建类型别名。在实际编程中,根据需要选择合适的关键字来定义常量或类型别名,以提高代码的可读性和可维护性。
总结:
在C语言中,字符串、结构体、共用体、位域和typedef都是非常有用的特性,可以帮助我们更好地组织和处理数据。通过合理地使用这些特性,我们可以编写出高效、灵活和可维护的程序。
相关文章:
【C语言从入门到放弃 4】字符串,结构体,共用体,位域,typedef详解
C语言是一种广泛应用于系统编程和嵌入式开发的高效编程语言。在本文中,我们将介绍C语言中的一些重要概念,包括字符串、结构体、共用体、位域和typedef,并提供简单的示例代码。 字符串 在C语言中,字符串是以空字符(\0…...
Linux学习第34天:Linux LCD 驱动实验(一):星星之火可以燎原
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 LCD显示屏是由一个一个的像素点构成的。当你能控制一个像素点的亮暗及颜色变化的时候,你就能让LCD显示瓶显示五颜六色的整幅图案。甚至可以让LCD屏幕…...
Flink SQL Window TopN 详解
Window TopN 定义(⽀持 Streaming): Window TopN 是特殊的 TopN,返回结果是每⼀个窗⼝内的 N 个最⼩值或者最⼤值。 应⽤场景: TopN 会出现中间结果,出现回撤数据,Window TopN 不会出现回撤数据…...
leetcode做题笔记216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 解释…...
Redis系列-Redis数据类型【3】
目录 Redis系列-Redis数据类型【3】字符串类型(String)SDS (simple dynamic string) 哈希类型(Hash)列表类型(List)集合类型(Set)有序集合类型(ZSet)字符串类…...
机器学习 - 决策树:技术全解与案例实战
目录 一、引言二、决策树基础决策树模型概述构建决策树的关键概念特征选择决策树的生成 决策树的剪枝 三、算法研究进阶提升树和随机森林提升树(Boosted Trees)随机森林(Random Forests) 进化算法与决策树决策树结构的进化 多目标…...
Opus 1.4 编译脚本
Opus 1.4 编译脚本 官网地址:https://www.opus-codec.org/ 仓库地址:https://gitlab.xiph.org/xiph/opus #!/bin/bash# 每次编译删除原来的编译文件 rm build -rf rm install -rf # 创建临时编译目录,避免污染源文件 mkdir build # 定义一…...
二进制搭建及高可用 Kubernetes v1.20
目录 一、实验规划: 二、操作系统初始化配置: 1. 关闭防火墙 selinux: 2. 关闭swap分区: 3. 根据规划设置主机名: 4. 所有主机添加hosts: 5. 调整内核参数: 6. 时间同步: 三、部署 etcd 集群:…...
SpringBoot 使用WebSocket打造在线聊天室
1、WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 2、浏览器通过 Java…...
vcpkg安装第三方库,报错fatal error RC1107: invalid usage; use RC /? for Help
记录一下,vcpkg不知道什么原因安装库失败。 首先就是原本安装过的库,再次安装之后。不知道环境哪里修改了。会导致安装报错。 Change Dir: D:/Software/vcpkg/buildtrees/freeglut/x64-windows-dbgRun Build Command(s): "D:/Program Files/Micros…...
axios的介绍及配置多个服务器url
文章目录 1、常用的默认配置的是:baseURL、method、timeout2、axios配置多个服务器url3、配置api文件4、文件中使用 1、常用的默认配置的是:baseURL、method、timeout ① baseURL:设置url的基本结构(请求根地址)&…...
C# OpenCvSharp 通过特征点匹配图片
SIFT匹配 SURF匹配 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Forms; using static System.Net…...
10个python爬虫入门实例
昨天带伙伴学习python爬虫,准备了几个简单的入门实例,涉及主要知识点: web是如何交互的 requests库的get、post函数的应用 response对象的相关函数,属性 python文件的打开,保存 代码中给出了注释,并且…...
麒麟KYLINOS命令行设置系统静音
原文链接:麒麟KYLINOS命令行设置系统静音 hello,大家好啊,今天给大家带来一篇在麒麟KYLINOS上使用命令行调节系统静音的方法,有时候需要制作模板,便可以采用此方法,话不多说,一起来看看吧。 1、…...
零信任安全:构建无懈可击的网络防护体系
随着网络技术的飞速发展,信息安全问题日益凸显,传统的安全防护手段已经无法满足复杂多变的安全需求。在此背景下,零信任安全模型逐渐受到广泛关注。本文将探讨零信任安全的概念、优势以及如何构建无懈可击的网络防护体系。 一、零信任安全概念…...
华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍
在第十四届全球移动宽带论坛上,华为高级副总裁、运营商 BG 总裁李鹏表示,大模型为代表的 AI 应用发展带来对智能算力的爆发式需求。 李鹏在题为《加速 5G 商业正循环,拥抱更繁荣的 5.5G》的讲话中表示,「5G 已经走在商业成功的正确…...
【漏洞复现】深信服下一代防火墙NGAF存在任意文件上传漏洞 附POC
漏洞描述 深信服下一代防火墙(Next-Generation Application Firewall)NGAF是面向应用层设计,能够精确识别用户、应用和内容,具备完整安全防护能力,能够全面替代传统防火墙,并具有强劲应用层处理能力的全新网络安全设备。NGAF解决了传统安全设备在应用识别、访问控制、内…...
城市内涝积水预防,万宾科技内涝监测仪如何预警?
近几年来城市内涝所引发的安全隐患极为突出,影响着城市道路安全,而且也让市民心中多有惶恐。一旦城市内涝问题出现背后不仅是路面积水问题,更会导致城市无法正常运行,导致市民日常生活和工作受到影响。所以对于排水防涝设施的建设…...
SpringBoot定时任务打成jar 引入到新的项目中后并自动执行
一、springBoot开发定时任务 ①:连接数据库实现新增功能 1. 引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependen…...
AD9371 官方例程 NO-OS 主函数 headless 梳理(一)
AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
Linux系统:进程间通信-匿名与命名管道
本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道(Pipe)是一种进程间通信(IPC, Inter-Process Communication)机制,用于在不…...
