【C++基础】13. 结构体

news2024/11/19 0:29:03

文章目录

  • 【 1. 结构体的定义 】
  • 【 2. 结构体成员的访问 】
  • 【 3. 结构体变量的声明 】
  • 【 4. 指向结构体的指针 】

  • 数组与结构体:C/C++ 数组允许定义可存储相同类型数据项的变量。而结构体是 C++ 中另一种用户自定义的可用的数据类型,它允许我们存储不同类型的数据项。

【 1. 结构体的定义 】

  • 结构体定义的一般形式:
    • type_name 是结构体类型的名称,
    • member_type1 member_name1 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。
    • 在结构定义的末尾,最后一个分号之前, 我们可以在定义完结构体后直接定义一个或多个结构变量,这是可选的。
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
  • 实例:声明一个结构体类型 Books,变量为 book1。
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book1;
  • 可以利用 typedef 为 所定义的结构体类型 起一个别名。
typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

Books Book1, Book2;

【 2. 结构体成员的访问 】

  • 使用成员访问运算符即小数点 . 访问结构体变量的成员。
  • 实例:定义结构体 Books 及其两个结构体变量 Book1 和 Book2,对两个结构体变量的成员进行赋值,最后输出信息。
#include <iostream>
#include <cstring>

using namespace std;

// 声明一个结构体类型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2

   // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Nowcoder"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;

   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Nowcoder");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 12346;

   // 输出 Book1 信息
   cout << "第一本书标题 : " << Book1.title <<endl;
   cout << "第一本书作者 : " << Book1.author <<endl;
   cout << "第一本书类目 : " << Book1.subject <<endl;
   cout << "第一本书 ID : " << Book1.book_id <<endl;

   // 输出 Book2 信息
   cout << "第二本书标题 : " << Book2.title <<endl;
   cout << "第二本书作者 : " << Book2.author <<endl;
   cout << "第二本书类目 : " << Book2.subject <<endl;
   cout << "第二本书 ID : " << Book2.book_id <<endl;

   return 0;
}

在这里插入图片描述

【 3. 结构体变量的声明 】

  • 在多个文件中调用结构体变量时,需要在一个 .h 文件中定义该结构体,再在 需要调用的 cpp 源文件中包含上述 .h 文件并 定义结构体变量,最后再在.h 文件中通过 extern 声明该结构体变量。
//.cpp文件
#include <iostream>
#include "test.h"
using namespace std;
lidar BenewakeLidar;

int main()
{
	BenewakeLidar.AMP = 123;
	cout << BenewakeLidar.AMP;
	return 0;
}
//.h文件
#ifndef TEST_H
#define TEST_H

typedef struct
{
	int Dist;
	int AMP;
	int tem;
	bool RecieveFlag;
}lidar;

extern lidar BenewakeLidar;

#endif

【 4. 指向结构体的指针 】

  • 结构体指针的一般定义形式:
struct Books *struct_pointer; // 创建结构体指针struct_pointer
struct_pointer = &Book1;      // 结构体指针指向结构体变量Books1
  • 利用 -> 运算符,通过结构体指针访问结构体成员。
struct_pointer->title;
  • 实例
#include <iostream>
#include <cstring>

using namespace std;
void printBook( struct Books *book );

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2

    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Nowcoder"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;

   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Nowcoder");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 12346;

   // 通过传 Book1 的地址来输出 Book1 信息
   printBook( &Book1 );

   // 通过传 Book2 的地址来输出 Book2 信息
   printBook( &Book2 );

   return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
   cout << "书标题  : " << book->title <<endl;
   cout << "书作者 : " << book->author <<endl;
   cout << "书类目 : " << book->subject <<endl;
   cout << "书 ID : " << book->book_id <<endl;
}

在这里插入图片描述

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

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

相关文章

在vscode中配置git bash终端、git 源码管理

打开vscode文件->首选项->设置&#xff0c;打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意&#xff1a; terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…

【Linux初阶】多线程3 | 线程同步,生产消费者模型(普通版、BlockingQueue版)

文章目录 ☀️一、线程同步&#x1f33b;1.条件变量&#x1f33b;2.同步概念与竞态条件&#x1f33b;3.条件变量函数&#x1f33b;4.条件变量使用规范&#x1f33b;5.代码案例 ☀️二、生产者消费者模型&#x1f33b;1.为何要使用生产者消费者模型&#x1f33b;2.生产者消费者模…

代理正向 反向代理

1.正向代理 主动发送流量 端口转发 反向代理 被动发送流量 正向代理的设置 画图 实验 利用 攻击机 外网 失控服务器 内网 外网都有 内部服务内网 使用工具 使用的恶意脚本 放到网页里 客户端 使用 网站访问 解析 一下 使用的工具 pyth…

Java学习_day01_hello java

构成 JDK JDK是java开发者工具&#xff0c;由JRE和一些开发工具组成。JRE JRE是java运行环境&#xff0c;由JVM和java核心类库组成。JVM JVM是java虚拟机&#xff0c;主要用来运行字节码。 执行过程 由IDE或文本编辑器&#xff0c;编写源代码&#xff0c;并将文件保存为*.ja…

谈谈 AOF

谈谈 AOF Append Only File&#xff0c;只追加文件。 AOF 文件存储的是具体的操作命令。 Redis 每执行一条写操作命令&#xff0c;执行完之后&#xff0c;就把该命令追加到 AOF_Buffer 缓冲区中&#xff0c;然后会使用某种写回策略&#xff0c;写回磁盘的AOF文件中。 Redis 重启…

【GD32】GD32F303串口设置DMA发生中断无法进入中断函数

在GD32F303官方提供的串口例程中&#xff0c;有一个DMA发生和接收中断例程&#xff0c;在模仿着写的过程中&#xff0c;能够正常发送数据&#xff0c;但是无法进入中断函数。DMA0_Channel3_IRQHandler函数时官方定义的弱函数&#xff0c;需要自己重新实现。如果开启了DMA0通道3…

ESP32单片机环境搭建(VScode + PlatformIO IDE)

一、环境搭建&#xff08;VScode PlatformIO IDE&#xff09; 1、官网下载VScode; 2、安装最新的插件&#xff08;C/C、PlatformIO IDE、python、Chinese&#xff09;&#xff1b; 3、在PlatformIO IDE中新建工程&#xff1a;Platforms——Projects——Create New Project——…

微信小程序-3

一、交互 API - - - 界面 - - - 交互 功能&#xff1a;提示 是否删除 1.wx.showToast 显示消息提示框 <button type"primary" bindtapclickBtn>按钮</button> <input style"margin: 20rpx;height: 60rpx;background: gainsboro;" type&…

百度文心一言 VS GPT

更多精华&#xff1a;即兴小索奇 | Link3 相信大家都关注AI&#xff0c;AI大模型已成为了科技领域的新焦点&#xff0c;各大科技巨头都争相推出自家的版本。其中&#xff0c;尤为引人注目的是中国科技巨头百度所推出的文心大模型。然而&#xff0c;即使在这激烈的竞争中&#x…

【数据结构与算法】字符串匹配,BF算法和KMP算法,next数组求法

朴素的模式匹配算法 bf算法 假设在主串S"helloworld"中找T"hellr"这个子串的位置 实现的思路如下 第一轮&#xff1a;子串中的第一个字符和主串中的第一个字符进行比较 如果相等&#xff0c;继续比较主串和子串中的第二个字符如果不相等&#xff0c;进行…

解决vue3 + vite + ts 中require失效的问题(require is not defind)

require is not defind因为require是属于webpack的方法&#xff0c;vite中找不到这个方法肯定报错 解决办法 通过vite官网了解到新的引入方式&#xff0c;我使用了其中一种 imgList: [{name: "lj",src: new URL(../../assets/img/applyList.png, import.meta.url).…

大数据 DataX 数据同步数据分析入门

目录 一、DataX 概览 1.1 DataX 是什么 1.2 DataX 3.0 概览 设计理念 当前使用现状 二、DataX 详解 2.1 DataX 3.0 框架设计 2.2 DataX 3.0 插件体系 2.3 DataX 3.0 核心架构 2.3.1 核心模块介绍 2.3.2 DataX 调度流程 2.4 DataX 3.0 的六大核心优势 2.4.1 可靠的…

为Mkdocs添加在线聊天(Tidio为例)

以Tidio为例,Tidio免费版已经完全够用且无需梯子 访问Tidio官网 要在您的网站上使用 javascript 代码方法安装 Tidio&#xff0c;您需要创建一个 Tidio 帐户。要创建 Tidio 帐户&#xff0c;请访问我们的网站<www.tidio.com>&#xff0c;然后单击 “开始” 按钮创建新的…

代码随想录算法训练营第23期day24|回溯算法理论基础、77. 组合

目录 一、回溯算法基础 回溯法模板 二、&#xff08;leetcode 77&#xff09;组合 剪枝 一、回溯算法基础 1.回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出想要的答案&#xff08;为了提升效率&#xff0c;最多再加一个剪枝&#xff09; 2.回溯法解决的…

第五章 运输层 | 计算机网络(谢希仁 第八版)

文章目录 第五章 运输层5.1 运输层协议概述5.1.1 进程之间的通信5.1.2 运输层的两个主要协议5.1.3 运输层的端口 5.2 用户数据报协议UDP5.2.1 UDP概述5.2.2 UDP的首部格式 5.3 传输控制协议TCP概述5.3.1 TCP最主要的特点5.3.2 TCP的连接 5.4 可靠传输的工作原理5.4.1 停止等待协…

SpringMVC源码分析(三)HandlerExceptionResolver启动和异常处理源码分析

问题&#xff1a;异常处理器在SpringMVC中是如何进行初始化以及使用的&#xff1f; Spring MVC提供处理异常的方式主要分为两种&#xff1a; 1、实现HandlerExceptionResolver方式&#xff08;HandlerExceptionResolver是一个接口&#xff0c;在SpringMVC有一些默认的实现也可以…

(ubuntu) 安装JDK

文章目录 前言参看java版本的命令&#xff1a;安装jdk命令安装jps关闭防火墙&#xff1a;查看端口占用&#xff1a;&#xff08;坑&#xff09;ubuntu上Mysql默认标明 区分大小写 前言 提示&#xff1a;常以为人是一个容器&#xff0c;盛着快乐&#xff0c;盛着悲哀。但是人不…

JUC并发编程——线程池学习:基础概念及三大方法、七大参数、四大拒绝策略(基于狂神说的学习笔记)

线程池 池化技术的本质&#xff1a;事先准备好一些资源&#xff0c;线程复用&#xff0c;用完即还&#xff0c;方便管理 默认大小&#xff1a;2 最大并发数max 根据电脑去设置&#xff0c;CPU密集型&#xff0c;IO密集型 线程池的好处&#xff1a; 降低资源的消耗提高响应的…

【马蹄集】—— 概率论专题

概率论专题 目录 MT2226 抽奖概率MT2227 饿饿&#xff01;饭饭&#xff01;MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 小码哥正在进行抽奖&#xff0c;箱子里有…

双目项目实战---测距(获取三维坐标和深度信息)

目录 1.简介 2.模块讲解 2.1 立体校正 2.1.1 校正目的 2.1.2 校正方法 2.2 立体匹配和视差计算 2.3 深度计算 3.完整代码 1.简介 双目视觉是一种通过两个摄像机&#xff08;或者两个镜头&#xff09;同时拍摄到同一个场景&#xff0c;再通过计算机算法来获取该场景深度…