「C系列」C 结构体

文章目录

  • 一、C 结构体
    • 1. 定义结构体
    • 2. 声明结构体变量
    • 3. 初始化结构体变量
    • 4. 访问结构体成员
    • 5. 结构体数组
    • 6. 结构体指针
    • 7. 结构体嵌套
  • 二、C 如何使用结构体
    • 1. 定义结构体类型
    • 2. 声明结构体变量
    • 3. 初始化结构体变量
    • 4. 访问结构体成员
    • 5. 结构体指针
    • 6. 在函数中使用结构体
    • 7. 注意事项
  • 三、相关链接

一、C 结构体

在C语言中,结构体(struct)是一种复合数据类型,它允许你将多个不同类型的数据项组合成一个单一的类型。结构体常用于表示具有多个相关属性的数据项,如一个学生的信息(包括学号、姓名、年龄等)。
在这里插入图片描述

1. 定义结构体

你可以使用 struct 关键字来定义一个新的结构体类型。例如,以下代码定义了一个名为 Student 的结构体,它包含学号(studentID)、姓名(name)和年龄(age)三个成员:

struct Student {int studentID;char name[50];int age;
};

2. 声明结构体变量

在定义了结构体类型之后,你可以声明该类型的变量。例如:

struct Student student1;

你也可以在定义结构体的同时声明变量:

struct Student {int studentID;char name[50];int age;
} student1, student2; // 同时声明了student1和student2两个变量

3. 初始化结构体变量

你可以在声明时或稍后初始化结构体变量:

struct Student student1 = {12345, "Alice", 20}; // 声明并初始化// 或者稍后初始化
struct Student student2;
student2.studentID = 67890;
strcpy(student2.name, "Bob"); // 注意:使用strcpy来复制字符串
student2.age = 22;

4. 访问结构体成员

使用点操作符(.)来访问结构体变量的成员:

printf("Student ID: %d\n", student1.studentID);
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);

5. 结构体数组

你也可以声明结构体数组,以存储多个结构体实例:

struct Student students[3];// 初始化结构体数组
students[0] = (struct Student){1, "Alice", 20};
strcpy(students[1].name, "Bob");
students[1].studentID = 2;
students[1].age = 22;
// ... 类似地初始化students[2]

6. 结构体指针

你还可以使用指针来访问结构体:

struct Student *pStudent = &student1;// 使用指针访问结构体成员
printf("Name: %s\n", pStudent->name); // 注意使用->操作符来访问指针指向的结构体成员

7. 结构体嵌套

一个结构体也可以包含另一个结构体类型的成员:

struct Address {char street[100];char city[50];char country[50];
};struct Student {int studentID;char name[50];int age;struct Address address; // 结构体嵌套
};// 初始化并访问嵌套的结构体成员
struct Student student = {12345, "Alice", 20, {"123 Main St", "Springfield", "USA"}};
printf("Address: %s, %s, %s\n", student.address.street, student.address.city, student.address.country);

二、C 如何使用结构体

使用结构体(struct)在C语言中通常涉及定义结构体类型、声明结构体变量、初始化结构体变量、访问结构体成员等操作。以下是一个详细的使用结构体的示例:

1. 定义结构体类型

首先,你需要定义结构体类型。这可以通过struct关键字来完成。

#include <stdio.h>
#include <string.h>// 定义一个名为Point的结构体类型,包含x和y两个整型成员
struct Point {int x;int y;
};// 定义一个名为Rectangle的结构体类型,包含两个Point类型的成员(表示左上角和右下角)
struct Rectangle {struct Point topLeft;struct Point bottomRight;
};

2. 声明结构体变量

定义了结构体类型之后,你可以声明该类型的变量。

int main() {// 声明Point类型的变量p1和p2struct Point p1, p2;// 声明Rectangle类型的变量rectstruct Rectangle rect;// ... 后续可以进行初始化等操作return 0;
}

3. 初始化结构体变量

在声明结构体变量之后,你可以进行初始化。

int main() {// ...// 使用设计初始化(C99及更高版本支持)struct Point p1 = {1, 2};struct Point p2 = {.y = 4, .x = 3}; // 成员可以按照任意顺序初始化// 初始化Rectangle类型的变量rectstruct Rectangle rect = {{1, 1}, {5, 3}}; // 初始化topLeft和bottomRight成员// ...return 0;
}

4. 访问结构体成员

你可以使用点号(.)来访问结构体变量的成员。

int main() {// ... 初始化p1, p2, rect的代码 ...// 访问并打印Point结构体变量的成员printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y);printf("p2.x = %d, p2.y = %d\n", p2.x, p2.y);// 访问并打印Rectangle结构体变量的成员printf("rect.topLeft.x = %d, rect.topLeft.y = %d\n", rect.topLeft.x, rect.topLeft.y);printf("rect.bottomRight.x = %d, rect.bottomRight.y = %d\n", rect.bottomRight.x, rect.bottomRight.y);// ...return 0;
}

5. 结构体指针

你还可以使用指针来访问结构体的成员。这在你需要动态分配内存或者需要传递结构体到函数时特别有用。

int main() {// ... 初始化p1, p2, rect的代码 ...// 声明结构体指针并使其指向rectstruct Rectangle *pRect = &rect;// 使用指针访问结构体成员printf("pRect->topLeft.x = %d, pRect->topLeft.y = %d\n", pRect->topLeft.x, pRect->topLeft.y);// ... 类似地访问其他成员 ...return 0;
}

6. 在函数中使用结构体

结构体也可以作为函数的参数或返回值。

// 定义一个函数,它接受一个Rectangle类型的参数并打印其左上角和右下角的坐标
void printRectangle(struct Rectangle rect) {printf("TopLeft: (%d, %d)\n", rect.topLeft.x, rect.topLeft.y);printf("BottomRight: (%d, %d)\n", rect.bottomRight.x, rect.bottomRight.y);
}int main() {// ... 初始化rect的代码 ...// 调用函数打印Rectangle的内容printRectangle(rect);return 0;
}

7. 注意事项

  • 结构体成员可以是任何数据类型,包括其他结构体类型。
  • 结构体变量之间可以通过赋值操作进行拷贝,但是这样做会拷贝整个结构体(包括所有成员)。
  • 结构体的大小取决于其成员的类型和数量,并且可能受到内存对齐的影响。
  • 使用结构体时,要确保不要越界访问其成员,特别是当结构体

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C系列」C 简介
  4. 「C系列」C 基本语法
  5. 「C系列」C 数据类型
  6. 「C系列」C 变量及常见问题梳理
  7. 「C系列」C 常量
  8. 「C系列」C 存储类
  9. 「C系列」C 运算符
  10. 「C系列」C 判断/循环
  11. 「C系列」C 函数
  12. 「C系列」C 作用域规则
  13. 「C系列」C 数组
  14. 「C系列」C enum(枚举)
  15. 「C系列」C 指针及其应用案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1452667.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

简单实现linux下redis后台启动,开机自动启动(2024)

1.要实现redis后台启动&#xff0c;必须修改redis的配置文件&#xff0c;先cd /usr/local/src/redis-6.2.6到此目录后&#xff0c;先备份一份配置文件&#xff08;避免配置操作失误&#xff09;输入cp redis.conf redis.conf.bck再输入vi redis.conf修改配置文件 2.按/进入搜…

Linux-Tomcat服务配置到系统服务

目录 前言一、系统环境二、配置步骤step1 了解环境的安装路径step2 配置生成tomcat.pid文件step3 配置tomcat.service文件 三、测试systemctl命令管理Tomcat服务3.1 systemctl命令启动Tomcat服务3.2 systemctl命令查看Tomcat服务3.3 systemctl命令关闭Tomcat服务3.4 systemctl命…

leetcode 56合并区间

思路 合并就是首先应该按照left左边界排序&#xff0c;排完序以后&#xff0c;如果i的左边界小于等于i-1的右边界&#xff0c;说明有重合&#xff0c;此时这两个可以合并&#xff0c;右边界应该取最大值。 代码 排序 我是定义了一个类,存储左右边界&#xff0c;先将数组转化…

TIA博途中库类型和库元素的基本使用方法介绍

TIA博途中库类型和库元素的基本使用方法介绍 TIA博途中有两种不同类型的库: “项目库” “全局库” 内容由两种存储类型组成: • “类型” • “模板副本” (1) “项目库” – 集成在项目中,与项目一起管理 – 允许项目内可重复使用 (2) “全局库” – 独立库 – 可在…

Python虚拟环境的配置

前言&#xff1a; 本人一度被Python的虚拟环境的配置所困扰&#xff0c;前段时间抽空学习了一下&#xff0c;现在总结一下方法&#xff0c;供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

&#x1f340;简介 Options是.net Core Web api框架自带的功能&#xff0c;Options模式通过定义强类型的类来表示相关配置设置的集合&#xff0c;使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

给Windows软件添加异常捕获模块生成dump文件(附源码)

软件在运行过程中会时常发生内存越界、内存访问为例、stack overflow线程栈溢出、空指针与野指针等异常崩溃,仅仅是依靠Debug和Release下的调试是远远不够的,因为有些崩溃不是必现的,或者是Debug下很难出现的。所以我们需要在软件中添加异常捕获的模块,在捕获到异常时生成包…

带侧边栏布局:带导航的网页

目录 任务描述 相关知识 HTML(HyperText Markup Language) CSS&#xff08;Cascading Style Sheets&#xff09;&#xff1a; 编程要求 任务描述 在本关中&#xff0c;你的任务是创建一个带侧边栏和导航的网页布局。这种布局通常用于网站或应用程序&#xff0c;其中侧边栏…

Mssql数据注入

1.查询用户创建的数据表 select id,name from sysobjects where xtypeu ; 2.查询用户创建数据表的具体列名 select * from syscolumns where id 上一步获取的id值; 3.查询具体内容 select id,字段名 from 数据表名&#xff1b; 4.数据库名 db_name() 5.用户登录名 su…

从大量文本中挖掘‘典型意见‘-基于DBSCAN的文本聚类实战

文本聚类,是一个无监督学习里面非常重要的课题,无论是在风控还是在其他业务中,通过对大规模文本数据的分析,找出里面的聚集观点,有助于发现新的问题或者重点问题。 通过对评论文本的分析,我们可以发现消费者关注的产品或服务痛点 通过对店铺商品标题的文本聚类,可以知…

Node入门以及express创建项目

前言 记录学习NodeJS 一、NodeJS是什么&#xff1f; Node.js 是一个开源和跨平台的 JavaScript 运行时环境 二、下载NodeJs 1.下载地址(一直点击next即可&#xff0c;记得修改安装地址) https://nodejs.p2hp.com/download/ 2.查看是否安装成功&#xff0c;打开命令行 nod…

性能调优 15. JVM调优实战及常量池详解

1. 阿里巴巴Arthas详解 1.1. 介绍 ‌‌‌  Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6&#xff0c; 采用命令行交互模式&#xff0c;可以方便的定位和诊断线上程序运行问题。 ‌‌‌  Arthas 官方文档十分详细&#xff0c;详见 ‌‌‌  http…

可视化图表:如此高颜值柱状图,其实简单配置就能实现。

这不又有某个boss给我图截图一些柱状性图表&#xff0c;说他们的前端觉得很难&#xff0c;说了一堆技术术语&#xff0c;他也不懂&#xff0c;截图我看到后&#xff0c;就给了他一个网址&#xff0c;马上就解决了。 在这里给大家摘录出几个比较有特色的柱状图出来&#xff0c;让…

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么???

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么&#xff1f;&#xff1f;&#xff1f; 这些精度是用来干嘛的&#xff1f;&#xff1f;混合精度 mixed precision training什么是混合精度&#xff1f;怎么转换呢&#xff1f; 为什么大语言模型通常使用FP32精度训练量化…

Maven常用命令介绍(Ⅰ)

基本命令 Maven生命周期 Maven的生命周期是对所有的构建过程进行抽象和统一。Maven的生命周期是抽象的&#xff0c;这意味着生命周期本身不做任何实际的工作&#xff0c;生命周期只是定义了一系列的阶段&#xff0c;并确定这些阶段的执行顺序。而在执行这些阶段时&#xff0c;…

基于iBeacon蓝牙定位技术的反向寻车系统

随着城市化进程的加速和汽车保有量的不断增加&#xff0c;大型停车场成为了人们日常生活中不可或缺的一部分。然而&#xff0c;在繁忙的停车场中快速找到自己的车辆&#xff0c;成为了许多车主的难题。为了解决这一问题&#xff0c;维小帮基于iBeacon蓝牙技术打造的反向寻车系统…

完美的移动端 UI 风格让客户无可挑剔

完美的移动端 UI 风格让客户无可挑剔

【CDN】逆天 CDN !BootCDN 向 JS 文件中植入恶意代码

今天在调试代码&#xff0c;突然控制台出现了非常多报错。 这非常可疑&#xff0c;报错指向的域名也证实了这一点。 因为我的 HTML 中只有一个外部开源库&#xff08;qrcode.min.js&#xff09;&#xff0c;因此只有可能是它出现了问题。 我翻看了请求记录&#xff0c;发现这…

pyinstall打包exe报错

1- 报错 Please install pywin32-ctypes. 前提&#xff1a;python安装路径中已经安装了pywin32-ctypes。 运行pyinstaller报错 PyInstaller cannot check for assembly dependencies. Please install pywin32-ctypes. 解决思路&#xff1a; python安装路径下Lib\site-packa…

金蝶云星空程序员开发快速入门

文章目录 一 前言1.1 学习步骤1.2 学习需知 二、学习金蝶*云星空的步骤2.1 下载金蝶*云星空安装到本地2.2 查看官网的学习资料2.3 如何使用C#进行插件开发2.4 sqlserver的表设计以及存储过程2.5 如何使用python进行插件的开发2.6 第三方程序如何调用金蝶*云星空的数据 三 后记 …