「C系列」C 结构体

news2025/2/24 3:17:40

文章目录

  • 一、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和p2
    struct Point p1, p2;
    
    // 声明Rectangle类型的变量rect
    struct Rectangle rect;
    
    // ... 后续可以进行初始化等操作
    
    return 0;
}

3. 初始化结构体变量

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

int main() {
    // ...

    // 使用设计初始化(C99及更高版本支持)
    struct Point p1 = {1, 2};
    struct Point p2 = {.y = 4, .x = 3}; // 成员可以按照任意顺序初始化
    
    // 初始化Rectangle类型的变量rect
    struct 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的代码 ...

    // 声明结构体指针并使其指向rect
    struct 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.coloradmin.cn/o/1824379.html

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

相关文章

ArcGIS 10.2软件安装包下载及安装教程!

今日资源&#xff1a;ArcGIS 适用系统&#xff1a;WINDOWS 软件介绍&#xff1a; ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成…

最经济实惠的通配符SSL证书是哪款?

网络安全已成为企业和个人网站运营者关注的焦点。SSL证书作为确保数据传输安全的关键工具&#xff0c;其重要性不言而喻。特别是通配符SSL证书&#xff0c;因其能够为一个主域名及其所有子域名提供统一的安全保护&#xff0c;而受到广泛欢迎。但面对市场上众多的SSL证书品牌和价…

如何制作 PDF 文件

本文概述了如何使用 Microsoft Word、GeekerPDF、Google Docs 和 Mac Pages 创建 PDF。您还可以使用免费的 PDF 创建器&#xff1b;有许多可供下载或在线使用的创建器。 如何使用 Microsoft Word 创建 PDF 如果您拥有 2007 或更高版本的 Microsoft Word&#xff0c;创建 PDF 的…

重生之 SpringBoot3 入门保姆级学习(20、场景整合 Docker 的 Redis 对接与基础使用)

重生之 SpringBoot3 入门保姆级学习&#xff08;20、场景整合 Docker 的 Redis 对接与基础使用&#xff09; 6.3 整合 Redis 6.3 整合 Redis 1、创建新项目编写 application.properties 配置文件 # redis 配置 spring.data.redis.host192.168.1.4 spring.data.redis.port6379如…

搭建个人智能家居 6 -SGP30 CO₂与TVOC测量

搭建个人智能家居 6 -SGP30 CO₂与TVOC测量 前言说明ESPHomeHomeAssistant 前言 上一篇文章我们给这个智能家居系统添加了第三个外设&#xff0c;温湿度传感器。今天添加第四个外设&#xff0c;用于测量环境中CO₂与TVOC的传感器“SGP30”。 前问回顾&#xff1a; 搭建个人智能…

(游戏:挑一张牌)编写程序,模拟从一副 52 张的牌中选择一张牌。

(游戏:挑一张牌)编写程序&#xff0c;模拟从一副 52 张的牌中选择一张牌。程序应该显示牌的 大小(Ace、2、3、4、5、6、7、8、9、10、Jack、Queen、King)以及牌的花色(Clubs (黑梅花)、Diamonds(红方块)、Hearts(红心)、Spades(黑桃))。下面是这个程序的 运行示例: The card yo…

QT漂亮QSS样式模仿流行VUE Element UI ,QSS漂亮大方美观样式 QSS样式 QTableWidget 漂亮样式QSS 快速开发QSS漂亮界面

在现代应用程序开发中&#xff0c;用户界面&#xff08;UI&#xff09;的设计与用户体验&#xff08;UX&#xff09;占据了至关重要的位置。Vue.js框架因其灵活性和丰富的生态系统而广受欢迎&#xff0c;其中Element UI作为一套为Vue设计的桌面端组件库&#xff0c;以其清晰的视…

24年河北自考报名流程详细教程汇总

2024年河北自考本科报名马上就要开始了&#xff0c;想要参加考试报名的同学&#xff0c;提前看一下&#xff0c;了解一下报名流程&#xff0c;准备一些报名材料。 报名时间&#xff1a;2024年1月5日—10日8:00—22:00 考试时间&#xff1a;2024年4月13日—14日 报名照要求&…

贪心+思维,CF1615C - Menorah

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1615C - Menorah 二、解题报告 1、思路分析 两次连续操作相当于交换两位奇数次操作, 改变了01频数01频数是否能一样 -> -1 否则就是调整到该在的位置的最小操作次数 不一样的位置一定是偶数个,否则01频数…

视频号怎么保存视频到手机?推荐4种方法!

短视频已经成为了网友们的新宠&#xff0c;那么对于我们这些普通人来说&#xff0c;如何能够轻松提取视频号上的视频呢&#xff1f;今天&#xff0c;就让我们一起来探讨一下视频号视频提取各种方法和工具&#xff01; 虽然视频号视频的保存方式多种多样&#xff0c;但为了照顾那…

byzer 笔记总结

1.总览&#xff08;简单了解&#xff09; 1.1 数据挖掘的定义 基于大数据技术&#xff0c;针对有价值是业务场景&#xff0c;对数据中台沉淀的大量数据进行探索&#xff0c;分析。寻找数据与数据之间潜藏的关系&#xff0c;转化为自动化的算法模型&#xff0c;从而获取有价值的…

python数据分析---ch10 数据图形绘制与可视化

python数据分析--- ch10 python数据图形绘制与可视化 1. Ch10--python 数据图形绘制与可视化1.1 模块导入1.2 数据导入 2. 绘制直方图2.1 添加图表题2.2 添加坐标轴标签 3. 绘制散点图4. 绘制气泡图5. 绘制箱线图5.1 单特征的箱线图5.2 多特征的箱线图 6. 绘制饼图7. 绘制条形图…

网络编程(四)

一、使用wireshark抓包分析协议头 &#xff08;一&#xff09;wireshark常用的过滤语句 tcp.port <想要查看的端口号> ip.src <想要查看的源IP地址> ip.dest <想要查看的目的IP地址> ip.addr <想要查看的IP地址>&#xff08;二&#xff09;抓包分…

【linux】应用程序访问百度时,操作系统内核网络接口日志

代码合入&#xff1a; 登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/c639573cc7c4984913d4a89884347e5a30a51eac 启动操作系统运行dmesg的日志像这样&#xff1a; dmesg_log/2024_06_14_00_40_54.txt r77683962/linux-6.9.0 - Gitee.com 注意&#xf…

利用MongoDB构建现代支付系统|附《利用AI在支付领域的优势》报告下载

MongoDB 支付 通过实时整合和分析任何格式的数据 来丰富支付体验 为消费者提供增值服务和功能 丰富的支付体验 接受并丰富任何支付数据类型 使用灵活的文档数据模型实时整合和处理任何支付数据类型。JSON 文档&#xff08;与 MongoDB 使用的数据格式相同&#xff09;是支…

AI 一键换脸,背景替换,ioDraw让图片更有趣

还在为繁琐的图片处理而烦恼吗&#xff1f;快来试试ioDraw的AI图片工具&#xff01; 它集图像识别、图像生成、智能换脸、背景替换、图像融合、肖像风格化、空间风格化、智能扩图、智能抠图、画质提升、美颜、拉伸修复、透视校正等功能于一身&#xff0c;为你提供前所未有的图…

ssm162基于SSM的药房药品采购集中管理系统的设计与实现+vue

药房药品采购集中管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对药房药品采购信息管理混乱&…

使用Unsloth微调Llama3-Chinese-8B-Instruct中文开源大模型

微调Llama3-Chinese-8B-Instruct 微调是指在大规模预训练的基础模型上,使用特定领域或任务数据集进行少量迭代训练,以调整模型参数,提升其在特定任务上的表现。这种方法可以充分利用预训练模型的广泛知识,同时针对特定应用进行优化,达到更精准高效的效果。 Llama-3-Chinese-8B-…

【imagenet数据集下载】OpenxLab 数据集下载

最近在找Imagenet-1K的数据集&#xff0c;但是好多帖子上都说要到官网或网盘下载&#xff0c;但是下载慢&#xff0c;于是在OpenxLab中找到了Imagenet-1K数据集&#xff0c;只需要登陆就可以下载。 有两种方式下载&#xff1a; 1.页面下载 2.脚本下载 下载完成后会有ImageNe…

判断QT程序是否重复运行

打开exe&#xff0c;再次打开进行提示。 main.cpp添加&#xff1a; #include "QtFilePreview.h" #include <QtWidgets/QApplication> #include <windows.h> #include <qmessagebox.h> #pragma execution_character_set("utf-8")bool Ch…