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

【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语言中一种用于节省内存的技术,它允许在一个字节中存储多个字段。通过位域,我们可以定义结构体成员的位数,并有效地利用内存空间。

常见用法和注意事项:

  1. 节省内存空间:位域允许我们在一个字节中存储多个字段,这样可以有效地节省内存空间。在一些资源受限的嵌入式系统中,特别需要节省内存时,位域可以发挥重要作用。

  2. 位域成员的位数:位域成员的位数不能超过其所属数据类型的位数。例如,一个char类型的位域成员最多只能有8位。

  3. 位域成员的顺序:位域成员的顺序是由编译器决定的,可能会受到编译器的优化影响。因此,在使用位域时,需要确保位域的顺序和位数符合预期。

  4. 位域的可移植性:由于位域的布局和顺序依赖于编译器的实现,因此在不同的编译器和平台上,位域的行为可能会有所不同。因此,需要谨慎使用位域,尤其是在编写需要在不同平台上移植的代码时。

以下是一个简单的位域示例:

#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

它们有以下不同点:

  1. 作用范围:#define用于创建常量宏,可以用于定义常量、函数宏等,作用范围是整个程序。而typedef用于创建类型别名,可以用于定义新的数据类型名称,作用范围是在类型声明中。

  2. 替换方式:#define是在预处理阶段将标识符替换为指定的文本,不关心数据类型,只是简单的文本替换。而typedef是在编译阶段定义新的数据类型名称,关联到具体的数据类型。

  3. 数据类型:#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语言是一种广泛应用于系统编程和嵌入式开发的高效编程语言。在本文中&#xff0c;我们将介绍C语言中的一些重要概念&#xff0c;包括字符串、结构体、共用体、位域和typedef&#xff0c;并提供简单的示例代码。 字符串 在C语言中&#xff0c;字符串是以空字符&#xff08;\0…...

Linux学习第34天:Linux LCD 驱动实验(一):星星之火可以燎原

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 LCD显示屏是由一个一个的像素点构成的。当你能控制一个像素点的亮暗及颜色变化的时候&#xff0c;你就能让LCD显示瓶显示五颜六色的整幅图案。甚至可以让LCD屏幕…...

Flink SQL Window TopN 详解

Window TopN 定义&#xff08;⽀持 Streaming&#xff09;&#xff1a; Window TopN 是特殊的 TopN&#xff0c;返回结果是每⼀个窗⼝内的 N 个最⼩值或者最⼤值。 应⽤场景&#xff1a; TopN 会出现中间结果&#xff0c;出现回撤数据&#xff0c;Window TopN 不会出现回撤数据…...

leetcode做题笔记216. 组合总和 III

找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 解释…...

Redis系列-Redis数据类型【3】

目录 Redis系列-Redis数据类型【3】字符串类型&#xff08;String&#xff09;SDS (simple dynamic string) 哈希类型&#xff08;Hash&#xff09;列表类型&#xff08;List&#xff09;集合类型&#xff08;Set&#xff09;有序集合类型&#xff08;ZSet&#xff09;字符串类…...

机器学习 - 决策树:技术全解与案例实战

目录 一、引言二、决策树基础决策树模型概述构建决策树的关键概念特征选择决策树的生成 决策树的剪枝 三、算法研究进阶提升树和随机森林提升树&#xff08;Boosted Trees&#xff09;随机森林&#xff08;Random Forests&#xff09; 进化算法与决策树决策树结构的进化 多目标…...

Opus 1.4 编译脚本

Opus 1.4 编译脚本 官网地址&#xff1a;https://www.opus-codec.org/ 仓库地址&#xff1a;https://gitlab.xiph.org/xiph/opus #!/bin/bash# 每次编译删除原来的编译文件 rm build -rf rm install -rf # 创建临时编译目录&#xff0c;避免污染源文件 mkdir build # 定义一…...

二进制搭建及高可用 Kubernetes v1.20

目录 一、实验规划&#xff1a; 二、操作系统初始化配置&#xff1a; 1. 关闭防火墙 selinux&#xff1a; 2. 关闭swap分区&#xff1a; 3. 根据规划设置主机名&#xff1a; 4. 所有主机添加hosts&#xff1a; 5. 调整内核参数: 6. 时间同步: 三、部署 etcd 集群&#xff1a…...

SpringBoot 使用WebSocket打造在线聊天室

1、WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在WebSocket API中&#xff0c;浏览器和服务器只需要做一个握手的动作&#xff0c;然后&#xff0c;浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 2、浏览器通过 Java…...

vcpkg安装第三方库,报错fatal error RC1107: invalid usage; use RC /? for Help

记录一下&#xff0c;vcpkg不知道什么原因安装库失败。 首先就是原本安装过的库&#xff0c;再次安装之后。不知道环境哪里修改了。会导致安装报错。 Change Dir: D:/Software/vcpkg/buildtrees/freeglut/x64-windows-dbgRun Build Command(s): "D:/Program Files/Micros…...

axios的介绍及配置多个服务器url

文章目录 1、常用的默认配置的是&#xff1a;baseURL、method、timeout2、axios配置多个服务器url3、配置api文件4、文件中使用 1、常用的默认配置的是&#xff1a;baseURL、method、timeout ① baseURL&#xff1a;设置url的基本结构&#xff08;请求根地址&#xff09;&…...

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爬虫&#xff0c;准备了几个简单的入门实例&#xff0c;涉及主要知识点&#xff1a; web是如何交互的 requests库的get、post函数的应用 response对象的相关函数&#xff0c;属性 python文件的打开&#xff0c;保存 代码中给出了注释&#xff0c;并且…...

麒麟KYLINOS命令行设置系统静音

原文链接&#xff1a;麒麟KYLINOS命令行设置系统静音 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在麒麟KYLINOS上使用命令行调节系统静音的方法&#xff0c;有时候需要制作模板&#xff0c;便可以采用此方法&#xff0c;话不多说&#xff0c;一起来看看吧。 1、…...

零信任安全:构建无懈可击的网络防护体系

随着网络技术的飞速发展&#xff0c;信息安全问题日益凸显&#xff0c;传统的安全防护手段已经无法满足复杂多变的安全需求。在此背景下&#xff0c;零信任安全模型逐渐受到广泛关注。本文将探讨零信任安全的概念、优势以及如何构建无懈可击的网络防护体系。 一、零信任安全概念…...

华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍

在第十四届全球移动宽带论坛上&#xff0c;华为高级副总裁、运营商 BG 总裁李鹏表示&#xff0c;大模型为代表的 AI 应用发展带来对智能算力的爆发式需求。 李鹏在题为《加速 5G 商业正循环&#xff0c;拥抱更繁荣的 5.5G》的讲话中表示&#xff0c;「5G 已经走在商业成功的正确…...

【漏洞复现】深信服下一代防火墙NGAF存在任意文件上传漏洞 附POC

漏洞描述 深信服下一代防火墙(Next-Generation Application Firewall)NGAF是面向应用层设计,能够精确识别用户、应用和内容,具备完整安全防护能力,能够全面替代传统防火墙,并具有强劲应用层处理能力的全新网络安全设备。NGAF解决了传统安全设备在应用识别、访问控制、内…...

城市内涝积水预防,万宾科技内涝监测仪如何预警?

近几年来城市内涝所引发的安全隐患极为突出&#xff0c;影响着城市道路安全&#xff0c;而且也让市民心中多有惶恐。一旦城市内涝问题出现背后不仅是路面积水问题&#xff0c;更会导致城市无法正常运行&#xff0c;导致市民日常生活和工作受到影响。所以对于排水防涝设施的建设…...

SpringBoot定时任务打成jar 引入到新的项目中后并自动执行

一、springBoot开发定时任务 ①&#xff1a;连接数据库实现新增功能 1. 引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependen…...

AD9371 官方例程 NO-OS 主函数 headless 梳理(一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…...

BuildingMachineLearningSystemsWithPython部署指南:如何将机器学习模型投入生产环境

BuildingMachineLearningSystemsWithPython部署指南&#xff1a;如何将机器学习模型投入生产环境 【免费下载链接】BuildingMachineLearningSystemsWithPython Source Code for the book Building Machine Learning Systems with Python 项目地址: https://gitcode.com/gh_mi…...

数据库性能杀手:90%程序员都踩过的SQL坑

数据库性能杀手:90%程序员都踩过的SQL坑 当业务系统因一条低效SQL陷入卡顿,当百万级数据查询耗时从秒级飙升至分钟级,数据库性能瓶颈往往成为企业数字化转型的"阿喀琉斯之踵"。本文将通过真实案例拆解,结合EXPLAIN深度解析、索引策略优化、查询重构技巧三大核心模…...

Nemotron-CC-Math数据集:提升LLM数学推理能力的关键

1. 项目背景与核心价值NVIDIA最新发布的Nemotron-CC-Math数据集正在改变大语言模型&#xff08;LLM&#xff09;数学能力训练的格局。这个专门针对数学领域优化的预训练语料库&#xff0c;解决了当前通用语料库在数学推理任务上的三大痛点&#xff1a;数据质量参差不齐、专业符…...

Qwen3-4B-Instruct惊艳效果:数学证明推导+LaTeX公式生成质量实测

Qwen3-4B-Instruct惊艳效果&#xff1a;数学证明推导LaTeX公式生成质量实测 1. 模型概览与核心能力 Qwen3-4B-Instruct-2507是Qwen3系列的端侧/轻量旗舰模型&#xff0c;专为数学推理和科学计算场景优化。作为一款40亿参数规模的指令微调模型&#xff0c;它在数学证明推导和L…...

别再手动传文件了!用Ansible自动化部署Kettle 8.3服务器(附Playbook)

从手动到自动化&#xff1a;基于Ansible的Kettle 8.3服务器高效部署指南 在数据集成与ETL领域&#xff0c;Pentaho Data Integration&#xff08;Kettle&#xff09;作为开源工具的代表&#xff0c;已成为企业级数据处理的标配。然而传统的手动部署方式在面对多节点、高频率更新…...

参数传递规则问题-类型匹配

一、顶层参数传递给sub_function参数 note: candidate function not viable: no known conversion from ap_uint<32> * to ap_uint<16> * for 4th argument; void my_top (hls::stream<ap_axiu<PIX_W*N_PIX,1,1,1> >& src,hls::stream<ap_axiu&…...

企业如何用客户关系管理系统提升销售业绩?3步实现业绩增长的实战指南

很多企业在销售管理中会遇到这样的困境&#xff1a;客户没少开发&#xff0c;但成交率一直上不去&#xff1b;销售员没少努力&#xff0c;但业绩就是不见增长&#xff1b;团队没少开会&#xff0c;但问题总是反复出现。实际上&#xff0c;这些都是客户关系管理系统可以解决的问…...

基于VirtualLab Fusion的微结构仿真设计与加工技术(光栅、超表面、蛾眼结构的仿真与加工技术)课程

基于VirtualLab Fusion的微结构仿真设计与加工技术&#xff08;光栅、超表面、蛾眼结构的仿真与加工技术&#xff09;课程时间&#xff1a;2026/5/19&#xff08;二&#xff09;-5/20&#xff08;三&#xff09;课程地点&#xff1a;上海微结构元件作为现代光学系统的核心组成部…...

语言模型上下文学习能力评估:CL-bench基准解析

1. 语言模型上下文学习能力评估&#xff1a;CL-bench基准深度解析在人工智能领域&#xff0c;语言模型&#xff08;Language Models, LMs&#xff09;的快速发展已经使其能够解决各种复杂任务&#xff0c;从数学问题到编程挑战&#xff0c;再到专业级考试。然而&#xff0c;这些…...

Docker 的镜像(Image)和容器(Container)

Docker 的镜像&#xff08;Image&#xff09;和容器&#xff08;Container&#xff09;是其最核心的两个概念&#xff0c;理解它们的关系是掌握 Docker 的关键。简单来说&#xff0c;镜像是静态的模板&#xff0c;而容器是这个模板运行起来的动态实例。这非常类似于面向对象编程…...