STLG_01_11_程序设计C语言 - 结构体

news2025/1/7 20:29:34

        在C语言中,结构体struct)是一种用户定义的数据类型,它允许将不同类型的数据组合在一起。结构体非常适合用于表示复杂的数据结构,例如记录、对象等。通过结构体,可以将相关的数据字段封装在一起,方便管理和操作。

1. 定义结构体

结构体的定义使用struct关键字,后面跟着结构体的名称和一组花括号{},花括号内部包含结构体的成员变量。每个成员变量可以是不同的数据类型。

struct Student {
    char name[50];      // 学生姓名
    int age;            // 学生年龄
    float gpa;          // 学生GPA
};

在这个例子中,struct Student定义了一个结构体,包含三个成员:name(字符数组)、age(整数)和gpa(浮点数)。

2. 声明结构体变量

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

struct Student student1;  // 声明一个Student类型的变量

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

struct Student {
    char name[50];
    int age;
    float gpa;
} student1, student2;  // 在定义结构体的同时声明两个变量

3. 访问结构体成员

使用.操作符来访问结构体变量的成员。

strcpy(student1.name, "Alice");  // 设置学生姓名
student1.age = 20;               // 设置学生年龄
student1.gpa = 3.8;              // 设置学生GPA

4. 结构体的初始化

你可以在声明结构体变量时进行初始化:

struct Student student2 = {"Bob", 22, 3.5};  // 初始化结构体

在这种初始化方式中,成员变量按定义顺序依次赋值。

5. 结构体的嵌套

结构体可以嵌套定义,即一个结构体的成员可以是另一个结构体。

struct Date {
    int year;
    int month;
    int day;
};

struct Person {
    char name[50];
    int age;
    struct Date birthdate;  // 嵌套结构体
};

使用嵌套结构体的示例:

struct Person person1;
person1.name = "Charlie";
person1.age = 30;
person1.birthdate.year = 1993;
person1.birthdate.month = 5;
person1.birthdate.day = 15;

6. 结构体的大小

结构体的大小是其所有成员大小的总和,但要注意内存对齐的问题。编译器可能会在结构体成员之间插入填充字节以优化内存访问效率。

#include <stdio.h>

int main() {
    struct Student {
        char name[50];
        int age;
        float gpa;
    };

    printf("Size of struct Student: %lu bytes\n", sizeof(struct Student));
    return 0;
}

7. 结构体指针

你可以使用指向结构体的指针,并通过->操作符访问成员。

struct Student *ptr;
ptr = &student1;

printf("Name: %s\n", ptr->name);
printf("Age: %d\n", ptr->age);
printf("GPA: %.2f\n", ptr->gpa);

8. 结构体数组

你可以定义结构体数组来存储多个结构体实例。

struct Student students[3];  // 定义一个包含3个Student结构体的数组

strcpy(students[0].name, "Alice");
students[0].age = 20;
students[0].gpa = 3.8;

strcpy(students[1].name, "Bob");
students[1].age = 22;
students[1].gpa = 3.5;

strcpy(students[2].name, "Charlie");
students[2].age = 21;
students[2].gpa = 3.7;

9. 结构体与函数

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

#include <stdio.h>
#include <string.h>

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

// 函数接受结构体作为参数
void printStudent(struct Student s) {
    printf("Name: %s\n", s.name);
    printf("Age: %d\n", s.age);
    printf("GPA: %.2f\n", s.gpa);
}

// 函数返回结构体
struct Student createStudent(char name[], int age, float gpa) {
    struct Student s;
    strcpy(s.name, name);
    s.age = age;
    s.gpa = gpa;
    return s;
}

int main() {
    struct Student student1 = createStudent("Alice", 20, 3.8);
    printStudent(student1);
    return 0;
}

10. 结构体的位域

结构体支持位域操作,允许你定义一个成员占用特定的位数。

struct Flags {
    unsigned int is_enabled : 1;  // 占用1位
    unsigned int mode : 2;        // 占用2位
};

11. 结构体的联合(Union)

联合是一种特殊的数据结构,它允许你存储不同类型的数据,但一次只能存储其中一种。

union Data {
    int i;
    float f;
    char str[20];
};

联合的大小等于其最大成员的大小。

总结

  • 结构体允许你将不同类型的数据组合在一起,适合表示复杂的数据结构。
  • 结构体的成员通过.操作符访问,指针通过->操作符访问。
  • 结构体可以嵌套、作为函数参数、返回值,以及用于数组等。
  • 注意内存对齐问题,结构体的大小可能会大于其成员大小的总和。

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

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

相关文章

(框架漏洞)

1.Thinkphp 1.Thinkphp5x远程命令执⾏及getshell 搭建靶场环境 vulhub/thinkphp/5-rce docker-compose up -d #启动环境 ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami ?s/Index/\think\app/invokefunctio…

[SMARTFORMS] 输出文本变量绑定

在SMARTFORMS表单中的表格接口的"导入"页签处添加导入参数IV_EBELN 参数IV_EBELN为采购凭证编号&#xff0c;并为该参数添加默认值 在SMARTFORMS表单中的全局定义中的"全局数据"页签定义变量 结构ZSPO_HEADER_437、ZSPO_ITEM_437与表类型ZTPO_ITEM_437的定…

【DevOps】Jenkins部署

Jenkins部署 文章目录 Jenkins部署资源列表基础环境一、部署Gilab1.1、安装Gitlab1.2、修改配置文件1.3、加载配置文件1.4、访问Gitlab1.5、修改root登录密码1.6、创建demo测试项目1.7、上传代码1.8、验证上传的代码 二、部署Jenkins所需软件2.1、部署JDK2.2、部署Tomcat2.3、部…

Redis(二)value 的五种常见数据类型简述

目录 一、string&#xff08;字符串&#xff09; 1、raw 2、int 3、embstr 二、hash&#xff08;哈希表&#xff09; 1、hashtable 2、ziplist 三、list&#xff08;列表&#xff09; ​编辑 1、linkedlist 2、ziplist 3、quicklist&#xff08;redis 3.2后的列表内…

PyQt实战——将pcm文本数据转换成.pcm的二进制文件

系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序入口QMainWindow&#xff08;三&…

Word2Vec解读

Word2Vec: 一种词向量的训练方法 简单地讲&#xff0c;Word2Vec是建模了一个单词预测的任务&#xff0c;通过这个任务来学习词向量。假设有这样一句话Pineapples are spiked and yellow&#xff0c;现在假设spiked这个单词被删掉了&#xff0c;现在要预测这个位置原本的单词是…

STM32F1学习——编码器接口

一、编码器接口 编码器接口可以接收正交编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;通过硬件自动控制CNT值的自增或自减&#xff0c;从而指出编码器的位置、旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口&#xff0c;他们会占…

什么是网关路由

1.认识网关 网关&#xff08;Gateway&#xff09;和路由&#xff08;Router&#xff09;是两个相关但不同的概念。 一、网关&#xff08;Gateway&#xff09; 定义 网关是一个网络节点&#xff0c;它充当了不同网络之间的连接点。可以将其看作是一个网络的 “大门”&#xf…

S32K144 UDSdoCAN 升级刷写实现笔记

文章目录 1. 摘要2. 开发环境搭建2.1 开发板2.2 IDE 安装2.3 更新扩展包2.4 烧录仿真测试2.4.1 新建工程2.4.2 导入已有工程2.4.3 编译工程2.4.4 硬件连接2.4.5 Debug2.4.6 添加 .c .h 文件2.5 串口配置2.5.1 时钟2.5.2 GPIO2.5.3 定时器2.5.4 uart 工程2.5.5 烧录验证3. 升级原…

第十八周:Faster R-CNN论文阅读

Faster R-CNN论文阅读 摘要Abstract文章简介1. 引言2. Faster R-CNN 框架2.1 RPN2.2 损失函数2.3 RPN的训练细节 3. Faster R-CNN的训练4. 优缺点分析总结 摘要 本篇博客介绍了 Faster R-CNN&#xff0c;这是一种双阶段的目标检测网络&#xff0c;是对 Fast R-CNN 的改进。为了…

Day28下 - 大模型微调:酒店评论情感分析

一、前置准备 1. 下载 LLaMA Factory https://github.com/hiyouga/LLaMA-Factory.git 搭建过程详见&#xff1a;https://blog.csdn.net/CSBLOG/article/details/144584581 2. 选择 预训练模型 和 prompt指令模型 预训练阶段在实际工作中&#xff0c;一般是用不上的&#xff…

【网络安全 | 漏洞挖掘】JS Review + GraphQL滥用实现管理面板访问

未经许可,不得转载。 正文 在映射目标范围后,我发现了一个用于管理的控制台界面,但没有注册功能。 于是我开始尝试: 1、模糊测试注册端点 -> 失败 2、在请求中将登录替换为注册 -> 再次失败 尝试均未奏效后,我决定冷静下来,重新思考方法并利用技术手段。 我观察…

数据库管理-第278期 开年综艺,第七届中国PG数据库生态大会有感(20250105)

数据库管理278期 20245-01-05 数据库管理-第278期 开年综艺&#xff0c;第七届中国PG数据库生态大会有感&#xff08;20250105&#xff09;1 走后门的可观测性2 社区VS商业3 从O来到PG去4 现场集锦5 IF CLUB社区总结 数据库管理-第278期 开年综艺&#xff0c;第七届中国PG数据库…

Docker 安装Elasticsearch搜索引擎 搜索优化 词库挂载 拼音分词 插件安装

介绍 允许用户快速索引和搜索大量的文本数据。通过使用倒排索引&#xff0c;它能够在海量数据中高效检索相关信息。提供灵活的查询语言&#xff0c;可以做全文搜索、模糊搜索、数据统计等&#xff0c;用来代替MYSQL的模糊搜索&#xff0c;MYSQL的模糊搜索不支持使用索引从而导…

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?

在视频监控系统中&#xff0c;FFmpeg常用于从各种源&#xff08;如摄像头、文件、网络流等&#xff09;获取流媒体数据&#xff0c;这个过程通常称为“取流”。 在EasyNVR平台中&#xff0c;使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具&#xff…

【电源专题】为什么测试电源的SW波形上冲振荡之前的0V电位要先来个小的下降

在同步电源的开关节点SW波形测试中,你可能会发现周期性的SW波形在上升前的一小段时间时间内会有一个小小的下跌,这个下跌会低于0V。那么这个下跌是怎么来的呢? 如下所示为某降压转换器的SW开关节点波形: 其展开后可以看到在上升之前有20ns左右的时间,SW电压是下跌…

基于EB和S32DS3.5建立基础工程

本文参考&#xff1a; https://blog.csdn.net/weixin_41660366/article/details/141949690 https://blog.csdn.net/zhoujingCSDN/article/details/142284796 0、简介 本文基于S32K312 介绍新建工程并引入EB&#xff0c;环境如下&#xff1a; MCU&#xff1a;NXP S32k312 RT…

如何申请LabVIEW软件著作权?

申请 软件著作权 时&#xff0c;若你的单位开发的应用是基于 LabVIEW 的图形化编程语言&#xff0c;你需要将 LabVIEW 程序中的图形化设计转换为源代码形式&#xff0c;以符合软件著作权申请的要求。由于LabVIEW本身是图形化编程语言&#xff0c;而不是传统的文本编程语言&…

C/C++中new/delete与malloc/free的区别及对象管理

C/C++中new/delete与malloc/free的区别及对象管理 在C/C++编程中,动态内存管理是一个核心且复杂的话题,其中new、delete、malloc和free是四个经常用于此目的的工具。尽管它们都涉及到内存的分配和释放,但它们在处理对象时的方式和效果却大相径庭。本文将通过示例来说明这些工…

GitHub 图像修复开源项目推荐【持续更新】

GFPGAN 介绍&#xff1a;GFPGAN&#xff08;Generative Facial Prior-GAN&#xff09;是由腾讯ARC&#xff08;Applied Research Center&#xff09;开发的一种实用的真实世界人脸修复算法。它专门设计用于人脸图像的生成和优化&#xff0c;尤其在低质量人脸图像的超分辨率恢复…