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

「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 指针及其应用案例

相关文章:

  • ZYNQ7 Processing System IP核中PS侧Uart的用法
  • Java课程设计:基于swing的贪吃蛇小游戏
  • HTML静态网页成品作业(HTML+CSS+JS)—— 美食企业曹氏鸭脖介绍网页(4个页面)
  • 机器学习二分类数据集预处理全流程实战讲解
  • java算法:选择排序
  • Linux之网络编程
  • JAVA系列---函数式接口
  • 图像的几何变换之平移
  • 【数据挖掘-思考】分类和聚类
  • Java基础面试重点-1
  • 【java计算机专业毕设】月度员工绩效考核管理系统java MySQL springboot vue maven代码源码 送文档
  • Opus从入门到精通(四)Opus解码程序实现
  • 【CT】LeetCode手撕—102. 二叉树的层序遍历
  • 如何查看当前的gruop_id 的kafka 消费情况 这个可以查看到是否存在消费阻塞问题
  • 记录:UA_Client_readValueAttribute 读取失败 C0错误码
  • “大数据应用场景”之隔壁老王(连载四)
  • ES6系列(二)变量的解构赋值
  • ES6语法详解(一)
  • java 多线程基础, 我觉得还是有必要看看的
  • JDK9: 集成 Jshell 和 Maven 项目.
  • mysql innodb 索引使用指南
  • Mysql优化
  • Otto开发初探——微服务依赖管理新利器
  • Quartz初级教程
  • React-Native - 收藏集 - 掘金
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Vue2 SSR 的优化之旅
  • Wamp集成环境 添加PHP的新版本
  • 树莓派 - 使用须知
  • 算法-图和图算法
  • 小而合理的前端理论:rscss和rsjs
  • 用mpvue开发微信小程序
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​补​充​经​纬​恒​润​一​面​
  • (09)Hive——CTE 公共表达式
  • (13)Hive调优——动态分区导致的小文件问题
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • *上位机的定义
  • .Net Core中Quartz的使用方法
  • .NET Core中如何集成RabbitMQ
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .NetCore发布到IIS
  • .NET开源快速、强大、免费的电子表格组件
  • .NET下ASPX编程的几个小问题
  • /proc/vmstat 详解
  • [3D基础]理解计算机3D图形学中的坐标系变换