【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员

6.5结构体指针变量

结构体的指针变量:本质是变量只是该变量保存的是结构体变量的地址


6.5.1结构体指针变量的定义

通过指针,可以访问到我们结构体变量的值

可以通过   ->  符号  访问到结构体变量 


6.5.2 结构体数组元素的指针变量

指针变量保存结构体数组元素的地址

struct Student7 {int num;char name[20];
};
void inputStuArr(Student7 *arr,int n){cout<<"请输入"<<n<<"个学员信息(num,name)"<<endl;for(int i = 0;i<n;i++){//注意数组的每个元素是结构体变量cin >> (arr + i)->num >> (arr + i)->name;}
}
void sortStuArray(Student7 *arr,int n){
//    for(int i = 0;i<n;i++){
//        for(int j = 0;j<n-i-1;j++){
//            if((arr+j)->num > (arr+j+1)->num){
//               Student7 temp = *(arr+j);
//               *(arr+j) = *(arr+j+1);
//               *(arr+j+1) = temp;
//            }
//        }
//    }//上述的可以替换成下面的for(int i = 0;i<n;i++){for(int j = 0;j<n-i-1;j++){if(arr[j].num > arr[j+1].num){Student7 temp = arr[j];arr[j] = arr[j+1] ;arr[j+1] = temp;}}}
}void coutStuArr(Student7 *arr,int n){cout << "---------------------输出为------------"<<endl;for(int i = 0;i<n;i++){//注意数组的每个元素是结构体变量cout << arr[i].num << " " <<arr[i].name<<endl;}}
void test10(){Student7 Tomarr[3];memset(&Tomarr,0,sizeof(Student7));int n = sizeof(Tomarr)/sizeof(Tomarr[0]);//封装 获取键盘输入inputStuArr(Tomarr,n);//给数组排序sortStuArray(Tomarr,n);//输出结构体数组的内容coutStuArr(Tomarr,n);
}int main()
{test10();return 0;
}

6.6结构体的指针成员

6.6.1 结构体的指针成员定义

name 是一个指向 const char 的指针,在 C++11 之前的版本中,可以将字符串字面值直接赋值给 const char* 类型的指针。但从 C++11 开始,需要将 name 的声明改为 const char*,以便与字符串字面值类型匹配。通过在 name 声明中添加 const 关键字,表示 name 是一个指向常量字符串的指针,并且可以安全地将字符串赋值给 const char* 类型的指针。这样就符合了 C++11 引入的更严格的类型匹配规则。 

jery.name保存的是"jery"的首元素地址,而"jery"字符串本身存储在文字常量区

6.6.2 结构体指针成员指向堆区

使用new申请新的空间后再赋值,注意C++11以后需要使用strcpy_s并且携带大小。最后别忘记释放申请的堆区空间,


6.6.3 结构体的浅拷贝

相同类型的结构体变量可以整体赋值,默认赋值方式为: 浅拷贝

浅拷贝仅仅会复制指针的地址,而不会去复制指针所指向的内容。

如果结构体中没有指针成员 浅拷贝不会带来问题

如果结构体中有指针成员浅拷贝会带来多次释放堆区空间的问题:

错误的原因是,此时导致了多次释放,但是不释放,又申请了内存。此时就会产生内存泄露的危机。 


6.6.4 结构体的深拷贝

如果结构体中有指针成员尽量使用深拷贝
所谓的深拷贝,就是为结构体的指针成员分配独立空间 然后再内容拷贝 


6.6.5 结构体变量在堆区结构体的指针成员也指向推区

 

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

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

相关文章

Redis键(Keys)

前言 在 Redis 中&#xff0c;键&#xff08;Keys&#xff09;是非常重要的概念&#xff0c;它们代表了存储在数据库中的数据的标识符。对键的有效管理和操作是使用 Redis 数据库的关键一环&#xff0c;它直接影响到数据的存取效率、系统的稳定性和开发的便利性。 本文将深入…

数字化转型时代,商业智能BI到底是什么?

据国际数据公司&#xff08;IDC&#xff09;预测&#xff0c;2025年时中国产生的数据量预计将达48.6ZB&#xff0c;在全球中的比例为27.8%。商业智能BI这一专为企业提供服务的数据类解决方案&#xff0c;仅2021年上半年在中国商业智能BI市场规模就达到了3.2亿美元&#xff0c;商…

docker部署Prometheus+Cadvisor+Grafana实现服务器监控

一&#xff1a;Prometheus 1&#xff1a;介绍&#xff1a; Prometheus是一个在SoundCloud上构建的开源系统监视和警报工具包 2&#xff1a;特点 多维度数据模型-由指标键值对标识的时间序列数据组成&#xff1b;PromQL&#xff0c;一种灵活的查询语言&#xff1b;不依赖分布…

在ant构建脚本中调用maven的命令

有时候想用maven管理依赖&#xff0c;用ant构建。 在ant的build.xml文件中可以使用exec这个task来调用系统命令&#xff0c;也就可以调用maven的命令。 例如&#xff0c;执行maven的命令mvn dependency:copy-dependencies&#xff0c;可以将项目的依赖提取出来&#xff0c;放…

msys2 + MSVC(VS2019)编译ffmpeg6.0源码

以前使用的v1.2版&#xff0c;很多功能和使用方法发生了变化&#xff0c;需要重新编译新的ffmpeg版。 编译环境: windows 10 , VS2019, MSYS2 1. msys2 下载安装 MSYS2 , https://www.msys2.org/ 2. msys2 环境配置打开 msys2 2.1 安装相关软件 然后输入以下命令安装&…

Scala---数据基础

一、数据类型 二、变量和常量的声明 定义变量或者常量的时候&#xff0c;也可以写上返回的类型&#xff0c;一般省略&#xff0c;如&#xff1a;val a:Int 10常量不可再赋值 1./** 2. * 定义变量和常量 3. * 变量 :用 var 定义 &#xff0c;可修改 4. * 常量 :用 val 定…

移动端APP版本治理

1 背景 在许多公司&#xff0c;APP版本都是不受重视的&#xff0c;产品忙着借鉴&#xff0c;开发埋头编码&#xff0c;测试想着不粘锅。 只有在用户反馈app不能用的时候&#xff0c;你回复客服说&#xff0c;让用户升级最新版本&#xff0c;是不是很真实。 而且业界也很少有…

AI创作系统ChatGPT源码+AI绘画系统+支持OpenAI DALL-E3文生图,可直接对话文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。新增支…

学Diffusion前需要储备的一些知识点

自学Diffusion是非常困难的&#xff0c;尤其是到了VAE和VI这里基本找不到比较好的中文资料&#xff0c;甚至是涉及到一些重参数化&#xff0c;高斯混合之类的问题摸不着来龙去脉。在本文中&#xff0c;基本不会涉及公式&#xff0c;只有intuition和理解&#xff0c;如果要看公式…

正点原子嵌入式linux驱动开发——Linux ADC驱动

在之前的笔记中&#xff0c;学习了如何给ICM20608编写IIO驱动&#xff0c;ICM20608本质就是ADC&#xff0c;因此纯粹的ADC驱动也是IIO驱动框架的。本章就学习一下如何使用STM32MP1内部的ADC&#xff0c;并且在学习巩固一下IIO驱动。 ADC简介 ADC ADC&#xff0c;Analog to D…

C/C++调试工具 - gdb详解

C/C调试工具 -gdb详解 1 简介 2 常用的命令 3 使用的条件 4 程序调试 4.1 直接运行程序 4.2 断点调试(在某一行) 4.3 断点调试(在函数入口处打断点) 5 调试core文件 5.1 生成core文件的方法 5.2 调试core文件 1 简介 GDB是Linux下非常好用且强大的调试工具。GD…

提升代码复用性:探讨Mixin类在面向对象语言中的独特作用和优势

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、m…