结构体的一些补充知识
1、结构体后面分号前面的名字是什么意思。
在C++中,结构体的定义格式为:
struct <结构体名> {// 成员变量和成员函数
};
在这个定义中,<结构体名>
就是结构体的名称,而这个名称位于结构体定义的末尾,分号之前。这个名称可以用来创建该结构体类型的变量。
结构体定义中的名称允许我们在后续代码中引用这个结构体类型。我们可以使用这个名称来声明结构体变量、作为函数参数类型或返回类型等。下面是一个简单的结构体定义和使用示例:
// 定义结构体
struct Person {string name;int age;
};int main() {// 使用结构体类型创建变量Person person1; // 声明一个名为person1的Person类型变量person1.name = "Alice";person1.age = 25;// 在函数中使用结构体类型void printPersonInfo(Person p) {cout << "Name: " << p.name << ", Age: " << p.age << endl;}// 将结构体作为函数参数printPersonInfo(person1);return 0;
}
在上面的示例中,struct Person
定义了一个名为Person的结构体类型。在main
函数中,我们使用Person
这个结构体类型来声明变量person1
,并且可以将Person
类型作为printPersonInfo
函数的参数类型。
因此,结构体名称位于分号之前的部分允许我们在程序中引用这个结构体类型,创建结构体变量,以及在函数参数和返回类型中使用结构体类型。
我们举个例子来看看,例子如下:
在C++中,可以在结构体定义的末尾紧跟一个变量名,用于定义该结构体类型的一个变量。例如:
struct Person {string name;int age;
} person1; // 定义了一个名为person1的Person类型变量
在这个例子中,我们定义了一个名为person1
的类型为Person
的结构体变量。这就是在这种格式下的含义。
2、结构体的另一种定义格式(其实和第一种差不多,区别不大,但是还是得说)
举个例子:
typedef struct
{char no[20];char name[50];float price;
} Book;
该行代码定义了一个结构体类型 Book
,它包含了三个成员变量:一个字符数组类型的变量 no
,用于存储图书编号;一个字符数组类型的变量 name
,用于存储图书名称;一个浮点型变量 price
,用于存储图书价格。
这下注意区别,这一下结构体末尾分号前面的名字就表示你定义的这个结构体类型的名字,而不是结构体类型又定义一个变量后的新名字,这得注意一下。
3、图书存储信息的一个示例.
这个例子其实和数据结构里面的线性表扯上了关系,但是不要管,因为这里面结构体运用多,所以来一个例子,看看结构体在实际中是怎么使用的,大致是什么模样就行:
//演示了如何使用指向结构体类型的指针变量来存储和访问图书信息:
#include <iostream>
#include <cstring>
using namespace std;#define MAXSIZE 10000// 定义 Book 结构体类型
typedef struct
{char no[20];char name[50];float price;
} Book;// 定义 SqList 结构体类型
typedef struct
{Book *elem;int length;/*因为在c++里面,数组长度是固定不变的,是不能修改的,所以我们就自己用一个
变量length来让线性表的长度可变,根据实际情况来调整线性表的长度,而不是像数组那样无法变化。这样,我们想要线性表里面有几个元素就有几个元素,想存储几个信息就几个信息,随心所欲。
*/
} SqList;int main()
{int n = 5; // 假设有 5 本书SqList list; // 声明一个线性表结构体变量list.elem = new Book[n]; // 动态分配 n 个 Book 类型大小的内存// 存储每一本书的信息for (int i = 0; i < n; i++){cout << "Enter the information of book " << i+1 << ":" << endl;cout << "No: ";cin >> list.elem[i].no;cout << "Name: ";cin >> list.elem[i].name;cout << "Price: ";cin >> list.elem[i].price;}list.length = n; // 将线性表的长度设置为 n// 输出每一本书的信息for (int i = 0; i < n; i++){cout << "Book " << i+1 << ":" << endl;cout << "No: " << list.elem[i].no << endl;cout << "Name: " << list.elem[i].name << endl;cout << "Price: " << list.elem[i].price << endl;}delete[] list.elem; // 释放动态分配的内存空间return 0;
}
在这个示例代码中,我们使用 new
运算符动态分配了 n 个 Book
类型大小的内存空间,然后通过循环输入每一本书的信息,并将其存储在分配的内存空间中。最后,输出每一本书的信息,并使用 delete[]
运算符释放动态分配的内存空间。
注意:list.elem这句话的意思:
在这个示例代码中,list.elem
是一个指针。指针是一种特殊的变量,它存储了一个内存地址。通过指针,我们可以访问存储在该地址上的数据。
在这个代码中,list
是一个结构体类型的变量,它有一个成员变量 elem
,类型为 Book*
,即指向 Book
结构体的指针类型。
当我们执行 list.elem = new Book[n];
这句话时,它的作用是将 list.elem
指向一个新分配的内存空间。
具体来说,new Book[n]
表示在堆上分配一块大小为 n * sizeof(Book)
字节的内存空间,用于存储 n
个 Book
结构体实例。然后,将这段内存空间的首地址赋值给 list.elem
,使得 list.elem
变量指向这段内存空间的首地址。
之后,我们就可以通过 list.elem
这个指针来访问和操作这段内存空间中的数据。例如,可以使用 list.elem[i]
来访问第 i
个 Book
结构体实例的成员变量。
需要注意的是,动态分配的内存空间在不再使用时,应该通过 delete[] list.elem;
或者 free(list.elem);
来释放,以防止内存泄漏问题。
4、结构体里面常用的符号"->"和"."
在C++中,->
和.
是两个不同的成员访问运算符,用于访问类、结构体或联合体的成员。
例如:
-
"."
(点运算符):- ) 用于直接访问对象的非静态成员。
- ) 对于对象,使用
.
来访问其成员变量或成员函数。 - ) 对于指针,使用
->
来访问指针所指向对象的成员变量或成员函数。
例如:
class MyClass { public:int myVariable;void myFunction() {// 函数体} };MyClass obj; obj.myVariable = 10; // 使用 . 访问对象的成员变量 obj.myFunction(); // 使用 . 调用对象的成员函数MyClass* ptr = &obj; ptr->myVariable = 20; // 使用 -> 访问指针所指向对象的成员变量 ptr->myFunction(); // 使用 -> 调用指针所指向对象的成员函数
->
(箭头运算符): -
) 用于通过指针访问对象的成员。
- ) 只能用于指向对象的指针,不适用于对象本身。
) ->
会对指针进行解引用操作,然后再访问成员。
例如:
class MyClass {
public:int myVariable;void myFunction() {// 函数体}
};MyClass obj;
MyClass* ptr = &obj;ptr->myVariable = 30; // 使用 -> 访问指针所指向对象的成员变量
ptr->myFunction(); // 使用 -> 调用指针所指向对象的成员函数
需要注意的一些情况:
.
只能用于对象本身,而->
只能用于指向对象的指针。- 当使用指针访问成员时,如果指针为空指针(nullptr),则使用
->
会导致未定义行为。
总结起来,.
和->
都是用于访问类、结构体或联合体的成员,区别在于.
用于对象本身,而->
用于指向对象的指针。
5、一些自我疑问与理解。
(1)定义一个结构体类型,是不是在内存空间里面开辟了连续的内存空间,供后面的操作使用?
解答:是的,结构体类型在内存空间中是连续的。当你定义一个结构体类型时,系统会为该结构体分配一块连续的内存空间,用来存储结构体的成员变量。这样,你就可以通过结构体变量来访问和操作这些成员变量。
结构体的内存布局是按照成员变量的声明顺序进行的,每个成员变量占据一定的内存空间。在内存中,结构体的起始地址就是第一个成员变量的地址(基地址),后面的成员变量依次排列在连续的内存地址上。
通过使用结构体指针,你可以获得结构体的起始地址,并通过偏移量来访问不同的成员变量。这种连续的内存布局使得结构体在内存中的访问速度较快,且可以方便地传递给函数或进行数据存储等操作。
(2)->这个符号前面是不是一定是指针变量才能使用的。
解答:是的,箭头运算符 ->
前面必须是指针变量才能使用。它用于访问指向结构体或类的指针变量所指向的成员变量或成员函数。
当你有一个指向结构体或类的指针变量时,通过箭头运算符 ->
可以方便地访问该结构体或类的成员变量或成员函数。如果前面不是指针变量,而是一个普通的结构体或类变量,则应使用点运算符 .
来访问其成员变量或成员函数。
下面是一个示例代码,演示了箭头运算符 ->
的用法:
#include <iostream>
using namespace std;// 定义 Book 结构体类型
typedef struct
{char no[20];char name[50];
} Book;int main()
{Book book; // 声明一个 Book 结构体变量Book* p = &book; // 声明一个指向 Book 结构体的指针变量,并将其指向 book 变量// 使用箭头运算符访问指针变量所指向的结构体的成员变量cout << "Enter the information of the book:" << endl;cout << "No: ";cin >> p->no;cout << "Name: ";cin >> p->name;// 输出指针变量所指向的结构体的成员变量cout << "Book information:" << endl;cout << "No: " << p->no << endl;cout << "Name: " << p->name << endl;return 0;
}
在上面的示例代码中,我们声明了一个 Book
结构体变量 book
,然后声明了一个指向 Book
结构体的指针变量 p
,并将其指向 book
变量。接着,使用箭头运算符 ->
访问指针变量 p
所指向的结构体类型的成员变量,并通过输入操作给成员变量赋值。最后,使用箭头运算符 ->
输出指针变量 p
所指向的结构体类型的成员变量。
(3)在下面的这个伪代码中,Book *elem;这句话要初始化吗?
#include <iostream>using namespace std;
#define MAXSIZE 10000typedef struct
{char no[20];char name[50];float price;
} Book;typedef struct
{Book *elem;int length;
} SqList;int main()
{return 0;
}
在这段代码中,Book *elem;
是一个结构体成员变量,它是一个指向 Book
结构体的指针,不需要进行初始化。因为它只是一个指针,它的值会被默认初始化为 NULL
。
在 C++ 中,指针在声明时并不会自动指向任何有效的内存地址,而是被初始化为 NULL
,表示它当前并没有指向任何有效的内存地址。如果我们不对指针进行初始化,它的值就是未定义的,可能是随机的,这会导致程序出现不可预知的错误。
但是,在这段代码中,我们看到 SqList
结构体中的 elem
成员变量并没有被初始化。这意味着,在程序运行时,我们必须先分配一定的内存空间,然后将 elem
指向这个内存空间的首地址(基地址),才能使用它。指向首地址,就是想利用顺序表来存储信息,因为知道了基地址,那么后面的所有地址也就都知道了,这是利用顺序表的特性来写的代码,以此来存储信息。
因此,虽然 Book *elem;
这句话不需要进行初始化,但在使用结构体类型 SqList
的实例时,我们需要使用动态内存分配函数 malloc()
或者 new
来为 elem
分配内存空间,并将其指向这个空间的首地址。否则,对 elem
的操作会导致程序崩溃或出现其他错误。
上面就是我所想表现的结构体与指针的混合使用,当然也有函数的,这就是数据结构里面的内容,具体的部分等我学到后面再继续补充和总结。
相关文章:
结构体的一些补充知识
1、结构体后面分号前面的名字是什么意思。 在C中,结构体的定义格式为: struct <结构体名> {// 成员变量和成员函数 };在这个定义中,<结构体名>就是结构体的名称,而这个名称位于结构体定义的末尾,分号之前…...
20V升26V 600mA升压型LED驱动芯片,PWM调光芯片-AH1160
AH1160是一个功能强大的升压型LED驱动芯片,专为需要精确控制LED亮度的PWM调光应用而设计。它可将20V输入电压升压至26V,同时提供稳定的600mA电流输出,适用于各种LED照明设备。 芯片特点: 1. 输入电压范围:AH1160可在…...
如何在Go中制作HTTP服务器
引言 许多开发人员至少会花一些时间创建服务器,以便在互联网上分发内容。HTTP (Hypertext Transfer Protocol,超文本传输协议)提供了大部分这些内容,无论是请求一张猫的图片还是请求加载你正在阅读的教程。Go标准库为创建HTTP服务器以提供web内容或向这些服务器发出HTTP请求…...
Linux笔记---系统信息
🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…...
最新版android stuido加上namespace
每个 Android 模块都有一个命名空间,此命名空间用作其生成的 命名空间由模块的 build.gradle 文件中的 namespace 属性定义,如以下代码段所示。namespace 最初会设为您在创建项目时选择的软件包名称。 Kotlin Groovy android {namespace "com.ex…...
Wireshark基础及捕获技巧
第一章:Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧:过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章:网络协议分析 2.1 网络协议分析:TCP、UDP、ICMP等 2.2 高级协议分析:HTTP…...
Windows下Navicat15.0连接Oracle11g报ORA-28547解决
目录 背景 一、相关环境 1、操作系统 2、Navicat版本 3、ORACLE连接 4、默认连接 二、问题分析 1、默认dll配置 三、修改配置 1、下载匹配的client 2、替换相应目录 总结 背景 最近在项目中需要使用Oracle数据库,当前很多应用系统的数据都存储在MySQL或者Pos…...
21 Vue3中使用v-for遍历对象数组
概述 使用v-for遍历对象数组在真实的开发中也属于非常常见的用法,需要重点掌握。 因为目前流行的是前后端分离开发,在前后端分离开发中,最常需要处理的就是对象数组类型的数据了。 比如,将员工信息渲染到表格中。 这节课我们就…...
深入理解Java自定义异常与全局异常处理 @RestControllerAdvice
异常主要是包括编译时的异常和运行时的异常。编译时的异常可以通过捕获异常获取,运行时候的异常主要是通过代码规范,或者测试。 Spring Boot提供了两种异常处理方式来统一处理和维护异常信息。 第一种方式是使用RestControllerAdvice注解与ExceptionHand…...
h5页面跳转微信小程序(最简单的方法|URL Scheme)
文章目录 导文实现获取 URL Scheme加密 URL Scheme获取方式拼接参数 明文 URL Scheme获取方式 实际项目展示:频率限制注意事项开放范围示例代码包 导文 H5页面跳转微信小程序的需求是普遍存在的。由于微信小程序是一种只能在微信内部访问的应用程序,而H5…...
智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.非洲秃鹫算法4.实验参数设定5.算法结果6.…...
持续集成交付CICD:Jenkins使用GitLab共享库实现前端项目镜像构建
目录 一、实验 1. GitLab修改项目文件与Harbor环境确认 2.Jenkins使用GitLab共享库实现前端项目镜像构建 3.优化CI流水线封装Harbor账户密码 4.Jenkins再次使用GitLab共享库实现前端项目镜像构建 一、实验 1. GitLab修改项目文件与Harbor环境确认 (1…...
SQL server 数据库 SQL语句高级用法
1、表的高级查询 use student select * from stuinfo1 -- 使用 in 的子查询 select * from stuinfo where stu_age in ( select stu_age from stuinfo where cla_id 12345 ) select * from stuinfo where stu_age in ( 19 , 20 , 21 , 25 , 23 , 1…...
wavlink 路由器 多处前台RCE漏洞复现
0x01 产品简介 WAVLINK是中国睿因科技(WAVLINK)公司开发的一款路由器。 0x02 漏洞概述 WAVLINK路由器mesh.cgi、nightled.cgi、live-api.cgi等接口处存在命令执行漏洞,攻击者可通过该漏洞获取服务器权限。包含型号WN530HG4、WN531G3、WN572HG3、WN535G3、WN575A4等。 0x…...
互联网中的商品超卖问题及其解决方案:Java中Redis结合UUID的应用
前言 在设计商品下单和库存扣减,你一定遇到过这样的问题,库存扣减为0了,可是消费者还能下单,并将订单信息保存到了数据库里,针对商品超卖问题,作此篇以解决。 随着互联网商业的飞速发展,商品超…...
mysql:查看线程缓存中的线程数量
使用命令show global status like Threads_cached;可以查看线程缓存中的线程数量。 例如,查询线程缓存中的线程数量如下: 然后启动应用程序,使用连接,查询如下: 由查询结果可以看到,线程缓存中的线程数量…...
线性表,也是Java中数组的知识点!
线性表定义: 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表,(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…...
java使用面向对象实现图书管理系统
꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …...
2023 英特尔On技术创新大会直播 |我感受到的“芯”魅力
文章目录 每日一句正能量前言AI时代,云与PC结合为用户带来更好体验全新处理器,首次引入针对人工智能加速的NPU大模型时代,软硬结合带来更好训练成果后记 每日一句正能量 成长是一条必走的路路上我们伤痛在所难免。 前言 在2023年的英特尔On技…...
Atium Designer 23 全新功能-丝印制备,解决DFM问题
进行PCB设计时需要养成良好的设计习惯,才能保证后期的生产效果。例如整板上需要保证丝印跟阻焊的间距规则避免产生丝印重叠造成的PCB制造设计(DFM)问题。丝印重叠阻焊的影响有如下: 1)PCB板后期打样,一般是…...
Nginx快速入门:安装目录结构详解及核心配置解读(二)
0. 引言 上节我们讲解了nginx的应用场景和安装,本节继续针对nginx的各个目录文件进行讲解,让大家更加深入的认识nginx。并通过一个实操案例,带大家来实际认知nginx的核心配置 1. nginx安装目录结构 首先nginx的默认安装目录为:…...
测试TensorFlow/PyTorch的GPU版本是否启用
文章目录 1. Pytorch测试代码2. TensorFlow测试代码 后续遇到好的会不断更新。。。 1. Pytorch测试代码 import torch def gpu_is_available():print(\nGPU details:)print(f gpu_is_available : , torch.cuda.is_available())print(f cuda_device_count : , t…...
字符串逆序输出
逆序输出就是本来abc输出的,然后我想让他输出成cba,那么我们还是要用到for循环,只不过原先是从零开始往上加,这回呢,是从上面往下减 我们观察上面这个图片,我们想要输出olleh,那么我们就要从4开…...
期货平仓日历(期货平仓日期汇总)
什么是期货平仓日历? 期货是一种高风险高收益的投资品种。而期货交易不同于股票等其他投资品种的交易,期货交易需要在一定时间内才能买卖。而期货平仓日历就是指期货交易中规定的所有合约的平仓日期汇总。 常见期货平仓日期和时间? 不同的…...
计算机网络-进阶
目录 易混淆物理层数据链路层网络层nat如何实现私有ip通信IP数据报 格式解析tcp 连接tcp流量控制滑动窗口拥塞控制 报文捕获 wireshark路由模拟器 enspcdn代理服务器 VS cdn VS web cache 计算机有了物理地址,为什么还要有ip地址?单播 多播 广播 传输层会…...
LED恒流驱动芯片SM2188EN:满足LED灯具出口欧盟所需的ERP能效认证标准和要求
LED灯具是一种节能环保的照明产品,因其高效节能、长寿命等优点而备受消费者青睐,成为照明市场的主流产品。作为LED灯具出口欧盟市场的必备条件,ERP能效认证标准和要求对LED灯具的能效性能提出了严格的要求。 首先,ERP能效认证标准…...
RocketMQ系统性学习-RocketMQ原理分析之消费者的接收消息流程
🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁dz…...
butterfly蝴蝶分类
一、分类原因 由于植物分类所使用的数据集存在一定问题,修改起来比较麻烦,本次采用kaggle的ButterflyMothsImageClassification数据集,对100这种蝴蝶进行分类。 二、100中蝴蝶类别 ‘ADONIS’,‘AFRICAN GIANT SWALLOWTAIL’,‘AMERICAN S…...
计算机基础:网络基础
目录 一.网线制作 1.制作所需要工具 网线制作标准 编辑 2.水晶头使用 3.网线钳使用 4.视频教学 二.集线器、交换机介绍 1.OSI七层模型 2.TCP/IP四层参考模型 3.集线器、交换机。路由器介绍 集线器 交换机 路由器 区别 三.路由器的配置 1.路由器设置 说明书 设…...
[原创][R语言]股票分析实战[3]:周级别涨幅趋势的相关性
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...
wordpress支付宝支付/手机网站智能建站
前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身。关于设计模式,作为程序猿的我们肯定都不陌生。博主的理解,所谓设计模式就是…...
什么网站做代购/长春网站建设技术支持
数据科学家 David Robinson 称,Python 是访问量增长最快的主流编程语言。在 Stackoverflow 上,主流编程语言如 Java、Javascript、C#、php 和 C 的问题访问量过去几年基本没太大的变动,只有 Python 一路呈上升趋势。小学一年级辅导 https://m…...
wordpress文章排版/东莞网站推广策划
摘要:2018 年“双 11”的交易额又达到了一个历史新高度 2135 亿。相比十年前,我们的交易额增长了 360 多倍,而交易峰值增长了 1200 多倍。相对应的,系统数呈现爆发式增长。系统在支撑“双 11”过程中的复杂度和难度呈现指数级形式…...
怎么用adobe软件做网站/微信引流主动被加软件
本节书摘来自异步社区《深入解析IPv6(第3版)》一书中的第1章,第1.2节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 IPv4地址空间受限的后果 由于IPv4的地址相对比较稀缺,人…...
网站靠什么挣钱/seo网络优化日常工作内容
继续做首页的相关内容,并和小组成员一起优化了其布局,在视频首页加了滚动展示图片,遇到问题不少,但大致解决。明天准备继续完成其他功能。转载于:https://www.cnblogs.com/qq1793033075/p/10934374.html...
清廉企业建设/seo怎么搞
前文说到使用统计学习方法进行文本分类就是让计算机自己来观察由人提供的训练文档集,自己总结出用于判别文档类别的规则和依据。理想的结果当然是让计算机在理解文章内容的基础上进行这样的分类,然而遗憾的是,我们所说的“理解”往往指的是文…...