结构体详解+代码展示

系列文章目录

🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集:我的C语言进阶合集,期待你的点击!!!🌈🌈

文章目录

  • 系列文章目录
  • 前言
  • 一、结构体的定义
  • 二、结构体的语法
    • (2.1)定义结构体类型
    • (2.2)声明结构体变量
    • (2.3)初始化结构体变量
  • 三、结构体的使用
  • 四、注意事项
  • 五、代码展示
  • 总结
  • END


前言

大家好,今天我来给各位分享C语言中自定义类型——结构体(struct)
结构体允许我们将多个不同类型的数据组合成一个单一的数据类型,从而可以更方便地管理和操作这些数据。
我将从其定义、语法、使用,注意事项,最后用代码来展示结构体的具体使用。


一、结构体的定义

结构体是C语言中的一种用户自定义的数据类型,
它允许我们将不同类型的数据项组合在一起,形成一个复合数据类型。

二、结构体的语法

(2.1)定义结构体类型

struct 结构体名称 
{
    数据类型 成员变量1;
    数据类型 成员变量2;
    ...
    数据类型 成员变量N;
};
  • 例如,定义一个表示学生信息的结构体类型:
struct Stu
{
    char name[20];
    int age;
};

(2.2)声明结构体变量

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

单独声明:

struct Stu stu1;
struct Stu stu2;

在定义时直接声明:

struct Stu 
{
    char name[20];
    int age;
} stu1, stu2;

(2.3)初始化结构体变量

可以通过直接赋值或使用指定初始化器进行初始化。

直接赋值:

struct Stu stu1 = {"Alice", 20};

或者使用C99标准中的指定初始化器:

struct Stu stu1 = { .name = "Alice", .age = 20 };

三、结构体的使用

自定义类型结构体变量可以通过点操作符(.)来访问其成员。

#include <stdio.h>

struct Stu 
{
    char name[20];
    int age;
};

int main() 
{
    struct Stu stu1 = { "Alice", 20};

    // 访问和打印结构体成员
    printf("Name: %s\n", stu1.name);
    printf("Age: %d\n", stu1.age);

    return 0;
}

输出结果展示:

四、注意事项

1、结构体类型的命名:通常使用大写字母开头的驼峰命名法(如Stu)来命名结构体类型,以区分普通变量类型。

2、结构体变量的作用域:与普通变量一样,结构体变量的作用域由其声明位置决定。

3、内存对齐:编译器可能会为了优化访问速度而对结构体成员进行内存对齐,这可能会导致结构体实际占用的内存比成员变量总和大。

4、嵌套结构体:一个结构体可以包含另一个结构体作为成员。

  • 如:
struct Addr 
{
    char street[20];
    char city[20];
};

struct Stu
{
    char name[20];
    int age;
    struct Addr addr;
};

5、结构体指针:可以通过指针来访问结构体成员,这在处理大型结构体或动态分配内存时非常有用

struct Stu* ps = &stu1;
printf("Name: %s\n", ps->name);

五、代码展示

代码示例:

  • 以下是一个完整的示例程序,展示了如何定义结构体、声明结构体变量、初始化结构体以及通过结构体指针访问成员。
#include <stdio.h>

// 定义一个存储地址的结构体
struct Addr 
{
    char street[20];// 存储街道名称
    char city[20];	// 存储城市名称
};

// 定义一个存储学生信息的结构体
struct Stu 
{
    char name[20];	 // 存储学生姓名
    int age;	  	 // 存储学生年龄
    struct Addr addr;// 嵌套的地址结构体
};

int main() 
{
    // 初始化结构体变量 stu1
    // 初始化时也初始化嵌套的 addr结构体
    struct Stu stu1 = { "Alice", 20, {"1haoStreet", "beijing"} };
	
    // 访问和打印结构体 stu1 的成员 
    printf("Name:%s\n", stu1.name);				// 打印学生姓名
    printf("Age:%d\n", stu1.age);				// 打印学生年龄
    printf("street:%s\n", stu1.addr.street);	// 打印学生地址的街道
    printf("city:%s\n", stu1.addr.city);		// 打印学生地址的城市

    // 打印分隔线
    printf("----------------------------------------------------\n");

	// 使用结构体指针访问和打印成员
    struct Stu* ps = &stu1;					// 创建指向 stu1 的指针 ps
    printf("Name:%s\n", ps->name);			// 使用指针访问并打印学生姓名
    printf("Age:%d\n", ps->age);			// 使用指针访问并打印学生年龄
    printf("street:%s\n", ps->addr.street );// 使用指针访问并打印学生地址的街道
    printf("city:%s\n", ps->addr.city );	// 使用指针访问并打印学生地址的城市

    return 0;
}

输出结果展示:


总结

通过以上分享和示例,相信大家对C语言中的结构体有了更深入的理解。
结构体是C语言中非常强大和灵活的一种数据类型,能够帮助我们更好地组织和管理数据。

END

每天都在学习的路上!
On The Way Of Learning

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度解析猎板 PCB树脂塞孔工艺

PCB 的树脂塞孔工艺是一种在印制电路板制造过程中广泛应用的重要技术&#xff0c;以下是猎板PCB批量工厂对PCB树脂塞孔该工艺的详细介绍&#xff1a; 猎板 PCB树脂塞孔工艺目的 防止短路&#xff1a;在 PCB 制造中&#xff0c;若过孔未被有效封堵&#xff0c;锡膏可能会从孔内…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后&#xff0c;我们就有能力去实现简易版扫雷游戏了&#xff08;成就感满满&#xff09;&#xff0c;下面是扫雷游戏的源码&#xff0c;快试一试效果如何吧&#xff01; 在test.c里面进行扫雷游戏的测试&#xff0c;game.h和game.c…

当前就业形势下C++方向后端开发学习指南

文章目录 1. C后端开发的职业方向1.1 C的应用领域1.2 后端开发的职业选择 2. 当前就业形势分析2.1 C开发者的市场需求2.2 C开发者的薪资水平 3. 学习路线3.1 入门阶段&#xff1a;掌握基础知识3.2 进阶阶段&#xff1a;掌握后端开发的核心技术3.2.1 数据库与C3.2.2 网络编程 3.…

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…

【论文复现】BERT论文解读及情感分类实战

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ BERT论文解读及情感分类实战 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence P…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

【Rabbitmq篇】高级特性----事务,消息分发

目录 事务 消息分发 应用场景 1. 限流 2.负载均衡 事务 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败. 何为原…

优先算法 —— 双指针系列 - 有效三角形的个数

1. 有效三角形的个数 题目链接&#xff1a; 611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-triangle-number/description/ 2. 题目解析 以示例1为例&#xff1a; 3. 优化 我们都知道&#xff0c;判断三角形的方法就是两边相…

【H2O2|全栈】Node.js(2)

目录 前言 开篇语 准备工作 npm 概念 常见指令 项目中的包 创建项目 启动项目 服务器搭建 express 基本步骤 搭建应用 创建路由 监听端口 启动服务器 面试相关 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解npm与服务器的简单…

Android 13 Aosp 默认允许应用动态权限

图库 frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java 修改 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm new DelayingPackageManagerCache();grantPermissionsToSysCompon…

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化?

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化&#xff1f; ⚠︎ 重要性&#xff1a;★★★ &#x1f4af; NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、…

DAY139权限提升-Linux系统权限提升篇Vulnhub辅助项目SUID权限SUDO指令版本漏洞

Linux提权 1、内核溢出提权 2、suid、sudo、nfs、path、ld_preload、cron、lxd、capability、rbash等 3、数据库类型提权 Linux&#xff1a; 系统用户&#xff1a;UID(0-999) 普通用户&#xff1a;UID(1000-*) root用户&#xff1a;UID为0&#xff0c;拥有系统的完全控制…

notepad++文件github下载

1、github下载网址&#xff1a;Releases notepad-plus-plus/notepad-plus-plus GitHub 2、找到操作系统支持的软件&#xff1a; 3、CSDN下载链接&#xff1a;https://download.csdn.net/download/u013083576/90046203

无人机应用板卡详解!

一、核心技术 无人机板卡的核心技术主要包括但不限于以下几种&#xff1a; 通信技术&#xff1a;无人机板卡通常集成了各种通信技术&#xff0c;如无线电通信、卫星通信等&#xff0c;以实现远程控制和数据传输。这些技术确保了无人机能够在复杂环境中保持稳定的通信连接。 …

分布式链路追踪系统

系统现状及需要解决的问题 系统异常无法接收告警 系统总会有这样或者那样的问题&#xff0c;同样的现象可能是不同的系统问题引起的&#xff0c;解决这些问题是研发的基本职责之一。 但是解决问题的前提是发现问题&#xff0c;系统告警就是我们发现感知问题的重要的手段&…

qt音频实战

一、Qt音频基础知识 1、QT multimedia 2、QMediaPlayer类&#xff1a;媒体播放器&#xff0c;主要用于播放歌曲、网络收音机等功能。 3、QMediaPlaylist类&#xff1a;专用于播放媒体内容的列表。 二、界面设计 三、代码 #include "mainwindow.h" #include "…

【Linux】剧幕中的灵魂更迭:探索Shell下的程序替换

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 一念既出&#xff0c;万山无阻 目录 &#x1f4d6;一、进程程序替换 1.替换的演示 ❓替换与执行流 ❓程序替换≠进程替换 2.替换的原理 …

DIY-Tomcat项目 part 1 实现和测试Request以及Response

实现Request package Webserver.src.connector;import java.io.IOException; import java.io.InputStream;/* GET /index.html HTTP/1.1Host: localhost:8888Connection: keep-aliveCache-Control: max-age0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 */public cla…

使用IDEA编写测试用例,复杂度校验

最近我们公司要求开发人员必须写测试用例&#xff0c;组织了TDD培训&#xff0c;测试驱动开发&#xff0c;同时衡量代码的圈复杂度&#xff0c;我记录下初次使用的过程。 编写测试用例&#xff0c;查看用例覆盖度 1、要编写测试用例&#xff0c;并看下测试用例的覆盖度&#…

Linux——用户级缓存区及模拟实现fopen、fweite、fclose

linux基础io重定向-CSDN博客 文章目录 目录 文章目录 什么是缓冲区 为什么要有缓冲区 二、编写自己的fopen、fwrite、fclose 1.引入函数 2、引入FILE 3.模拟封装 1、fopen 2、fwrite 3、fclose 4、fflush 总结 前言 用快递站讲述缓冲区 收件区&#xff08;类比输…