「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.mzph.cn/pingmian/27905.shtml

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

相关文章

docker run的复杂使用

sudo docker run -dit --namenmediacross1.x -v $HOME:$HOME -v /tmp/.X11-unix:/tmp/.X11-unix -v /dev/dri:/dev/dri --privileged --networkhost -e DISPLAYunix$DISPLAY -w $HOME nova:nmediacross1.x这个Docker命令相当复杂&#xff0c;包含了许多选项和参数&#xff0c;…

记录一次CTF图片拼图安装工具montage+gaps成功步骤以及踩坑全过程

安装图片拼接工具montage&#xff1a; 1.安装 使用pip install montage无法安装montage工具的师傅可以尝试下面的方法 #Debian apt-get install graphicsmagick-imagemagick-compat#Ubuntu apt-get install graphicsmagick-imagemagick-compat#Alpine apk add imagemagick6#…

安全相关的一些基础知识(持续更新)

目录 1. TRNG真随机数生成 2. 对称加密和非对称加密及其区别 3. Hash算法&#xff08;摘要算法&#xff09; 4. HTTPS、TLS、SSL、HTTP区别和关系 HTTPS的基本原理 5. PSS 1. TRNG真随机数生成 True Random Number Generator 在真随机数的生成里&#xff0c;把随机数的生…

编译rk3568 Android,rk3568_r-user和rk3568_r-userdebug的区别

在 Android 开发环境中,lunch 命令用于选择编译目标设备和构建类型。选择不同的构建类型(如 user 和 userdebug)会影响编译结果的特性和用途。以下是 rk3568_r-user 和 rk3568_r-userdebug 之间的主要区别: user 构建类型 (rk3568_r-user): 目标用户:最终用户(消费者)。…

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效 问题背景 使用undetected_chromedriver包驱动浏览器结束后报错句柄无效 Exception ignored in: <function Chrome.del at 0x000001DD50F07A60> Traceback (most recent call last): File “D:…

大数据实训项目(小麦种子)-01、VirtualBox安装与Centos7系统安装

文章目录 前言项目介绍项目任务目标一、VirtualBox安装1.1、认识VirtualBox1.2、VirtualBox的下载安装 二、VirtualBox安装Centos7系统2.1、VirtualBox安装Centos72.2、Centos7配置静态IP地址2.3、Centos7环境基础配置 三、Windows安装FinalShell及连接Centos73.1、FinalShell下…

父亲节马上到了-和我一起用Python写父亲节的祝福吧

前言 让我们一起用Python写一段父亲节的祝福吧 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python系列专栏 - 从零开始学python 话不多说先上代码 import tkinter as tk from doctest imp…

TS:元组

问: 解释下什么是元组 回答: 元组&#xff08;Tuple&#xff09;是一种数据结构&#xff0c;类似于数组&#xff0c;但与数组不同的是&#xff0c;元组中的元素类型可以各不相同&#xff0c;且元组的长度是固定的。元组在许多编程语言中都有实现&#xff0c;包括 TypeScript…

软设之系统设计之模块设计

模块设计原则概述: 保持模块的大小适中 深度&#xff0c;宽度适中 扇入&#xff0c;扇出系数要合理 模块的作用域应该在模块之内 功能应该是可预测的 高内聚&#xff0c;低耦合 内聚性: 按照从高到低&#xff0c;从强到弱性能排序 功能内聚&#xff0c;顺序内聚&#…

设计模式-享元模式Flyweight(结构型)

享元模式(Flyweight) 享元模式是一种结构型模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;减少内存占用。通过重用现有对象的方式&#xff0c;如果未找到匹配对象则新建对象。线程池、数据库连接池、常量池等池化的思想就是享元模式的一种应用。 图解 角色 享元工…

centos中安装并设置vsftpd

vsftpd是一个可安装在linux上的ftp服务器软件。 一、安装 安装前保证服务器能上互联网。如果不能上网&#xff0c;看看能不能设法利用局域网代理上网。 sudo yum -y install vsftpd二、配置 1、修改配置文件 cd /etc/vsftpd #修改之前记得备份&#xff01;&#xff01;&am…

远程桌面失败:你的凭据不工作

远程桌面失败&#xff1a;你的凭据不工作 远程桌面失败&#xff1a;你的凭据不工作_您的凭据不工作-CSDN博客https://blog.csdn.net/weixin_38004638/article/details/82290796

面试官:前端使用 JavaScript 如何判断变量类型?

你知道吗&#xff0c;在 JavaScript 中&#xff0c;变量的类型是动态的&#xff0c;这意味着同一个变量可以存储不同类型的值。这种动态类型的特性既是优势&#xff0c;也可能带来一些意想不到的问题。 这几天我在做项目时&#xff0c;遇到了一个从方法返回的值问题。这个值由…

Python3 笔记:字符串的 isspace()、istitle()、isdecimal()

1、isspace() 方法检测字符串是否只由空白字符组成。 语法&#xff1a;str.isspace() 如果字符串中只包含空格&#xff0c;则返回 True&#xff0c;否则返回 False。 str1 str2 hello print(str1.isspace()) # 运行结果&#xff1a;True print(str2.isspace()) # 运…

LoginGUI.java

LoginGUI.java 完成效果如下图&#xff1a; CODE Summary: This code sets up a login GUI using Swing. It defines a LoginGUI class extending JFrame. The constructor initializes the GUI components and sets up event listeners. The event_login method handles…

MacOS安装redis

文章目录 前言一、介绍二、下载三、安装四、启动五、配置六、Redis 可视化工具下载七、配置详解八、常用命令总结 前言 Redis因其高性能和低延迟而成为现代应用程序的理想选择&#xff0c;尤其适合需要快速读写操作的场景。随着技术的不断发展&#xff0c;Redis继续在性能、功…

电机控制安全:PWM 直通

在 H 桥中使用互补 PWM 时的一个主要考虑因素是短路的可能性&#xff0c;也称为“击穿”。 如图 5 所示&#xff0c;如果同一支路上的两个开关同时打开&#xff0c;H 桥配置可能会导致电源和接地之间发生直接短路。 如果同一条腿上的两个开关同时打开&#xff0c;则可能会发生…

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

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

区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BP-ABKDE的BP神经网络自适应带…

基于Matlab的人脸表情识别系统(GUI界面)【W4】

简介&#xff1a; 该系统是一个基于Matlab开发的人脸表情识别应用程序&#xff0c;旨在识别输入图像中的人脸表情&#xff0c;并通过直观的图形用户界面&#xff08;GUI&#xff09;向用户展示识别结果。系统结合了图像处理、机器学习和用户交互技术&#xff0c;使用户能够轻松…