【带头学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 结构体变量在堆区结构体的指针成员也指向推区

 

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

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

相关文章

Vue3弹性布局(Flex)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传width区域总宽度string | number‘auto’falseverticalflex 主轴的方向是否垂直&#xff0c;vertical 使用 flex-direction: columnbooleanfalsefalsewrap设置元素单行显示还是多行显示&#xff1b;参考 flex-wrap…

《线性代数》科教版教材必会习题

出一期比较尴尬的博客——有关线代教材的课后题总结~ 之所以说尴尬&#xff0c;主要有两个主要原因&#xff1a;这本科教版第三版的教材&#xff0c;整体看起来并不是那么舒服&#xff0c;甚至被我们的老师吐槽过&#xff0c;更好地选择时同济版的那本紫书——我们学校的新生这…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):FREERTOS移植

前言: 一般的GUI工程都需要一个操作系统,可能是linux,重量级的,也可能是FreeRTOS,轻量级的。 一句话理解那就是工程就是FreeRTOS task任务的集合。 一个main函数可以看到大框架: 很显然,除了第一个是硬件配置的初始化,中间最重要的部分就是要创建任务。而一个任务主…

扫码下载视频怎么做?适用多种格式视频文件

现在将视频制作二维码来展示的应用场景越来越多&#xff0c;企业、学校、个人、产品等等很多内容都会使用视频二维码。可能有些小伙伴用来生成二维码的视频只能查看不能下载&#xff0c;导致在使用时受到限制&#xff0c;那么想要制作可以下载视频二维码的小伙伴&#xff0c;下…

【unity】网格描边方法

【unity】网格描边方法 介绍对模型四边网格的三种描边方法&#xff1a;包括纯Shader方法、创建网格方法和后处理方法。于增强场景中3D模型的轮廓&#xff0c;使其在视觉上更加突出和清晰。这种效果可以用于增强三维场景中的物体、角色或环境&#xff0c;使其在视觉上更加吸引人…

Javaweb开发 利用servlet+jsp+jdbc+tomcat数据库实现登录功能

前言&#xff1a;很久没更新了&#xff0c;今天给大家分享一个Java web的小案例&#xff0c;是一个登录页面&#xff0c;利用Login控制类和JDBC连接数据库&#xff0c;并判断用户名密码是否正确&#xff0c;项目最终部署在Tomcat上。 先看效果 正文 一、前期工作 1.首先我们…

云课五分钟-02第一个代码复现-终端甜甜圈C++

前篇 云课五分钟-01课程在哪里-无需安装网页直达- 代码复现通过云课&#xff0c;会非常快捷。 视频 云课五分钟-02第一个代码复现-终端甜甜圈C 文本 如何使用g 使用g编译和链接C程序的基本步骤如下&#xff1a; 编写源代码&#xff1a;首先&#xff0c;你需要编写C源代码&…

Docker学习——⑧

文章目录 1、什么是 Docker Compose(容器编排)2、为什么要 Docker Compose&#xff1f;3、Docker Compose 的安装4、Docker Compose 的功能和使用场景5、Docker Compose 文件&#xff08;docker-compose.yml&#xff09;5.1 文件语法版本5.2 文件基本结构及常见指令 6、Docker …

【C#学习】串口编程

文章目录 第一步&#xff1a;加入串口控件第二步&#xff1a;加入模块第三步&#xff1a;编写相关函数功能获取所有串口资源设置和打开关闭串口发送字符串&#xff08;string&#xff09;发送byte检查串口状态接受byte查询所有可用串口 第一步&#xff1a;加入串口控件 第二步&…

Elasticsearch7 入门 进阶

1、全文检索 1.1、数据分类 按数据分类的话&#xff0c;主要可以分为以下三类&#xff1a; 结构化数据&#xff1a;固定格式、有限长度&#xff0c;比如mysql存的数据非结构化数据&#xff1a;不定长、无固定格式&#xff0c;比如邮件、Word文档、日志等半结构化数据&#xf…

Git 工作流程、工作区、暂存区和版本库

目录 Git 工作流程 Git 工作区、暂存区和版本库 基本概念 Git 工作流程 本章节我们将为大家介绍 Git 的工作流程。 一般工作流程如下&#xff1a; 克隆 Git 资源作为工作目录。在克隆的资源上添加或修改文件。 如果其他人修改了&#xff0c;你可以更新资源。在提交前查看…

抖音小程序开发全攻略:如何规划项目和选择合适的开发团队

在数字化时代&#xff0c;抖音小程序成为企业推广和服务的重要渠道。本文将为您提供抖音小程序开发的全面攻略&#xff0c;重点介绍如何规划项目和选择合适的开发团队&#xff0c;并附有一些关键的技术代码示例。 1. 项目规划 在开始抖音小程序开发之前&#xff0c;详细的项…

11月14日星期二今日早报简报微语报早读

11月14日星期二&#xff0c;农历十月初二&#xff0c;早报微语早读。 1、江西南城县&#xff1a;限时发放购房补贴政策&#xff0c;三孩家庭每平方米最高补贴500元&#xff1b; 2、2023年中国内地电影市场累计票房突破500亿元&#xff1b; 3、市场监管总局&#xff1a;在全国…

读写分离(基于mycat)和全同步复制

一、mycat实现读写分离&#xff08;VIP机制&#xff09; &#xff08;一&#xff09;配置主从复制 &#xff08;二&#xff09;部署mycat 1、安装Java 2、下载mycat安装包 3、解压mycat包 4、设置变量环境 5、启动mycat &#xff08;三&#xff09;客户端连接数据库 1、安装…

(论文阅读32/100)Flowing convnets for human pose estimation in videos

32.文献阅读笔记 简介 题目 Flowing convnets for human pose estimation in videos 作者 Tomas Pfister, James Charles, and Andrew Zisserman, ICCV, 2015. 原文链接 https://arxiv.org/pdf/1506.02897.pdf 关键词 Human Pose Estimation in Videos 研究问题 视频…

火车头采集器如何设置代理IP

火车头采集器作为一种强大的数据抓取工具&#xff0c;已经被很多人熟知&#xff0c;它最大的优势就是设置代理IP确保采集过程的顺利进行。 今天我们就来说说&#xff0c;火车头采集器是怎么设置代理IP的。 1.打开火车头采集器软件&#xff0c;在打开的界面中点击http二级代理…

使用select实现定时任务

selectOutOfTime.c里边的代码如下&#xff1a; #include<stdio.h> #include<sys/time.h> #include<sys/types.h> #include<unistd.h> #include <string.h>#define BUF_SIZE 100int main(void){fd_set reads;struct timeval tv;int errorNum;cha…

【数据结构】面试OJ题——带环链表(数学推论)

目录 1.环形链表Ⅰ ​编辑 思路 &#xff1a; 思路拓展 问题一&#xff1a; 问题二&#xff1a; 总结&#xff1a; 问题三&#xff1a; 证明总结第三点 总结&#xff1a; 2. 环形链表Ⅱ 思路一 思路二 3.相交链表 思路&#xff1a; 1.环形链表Ⅰ 141. 环形链…

AI生成图片教程(基于DALL-E3)

目录 前言new bingImage Creator 前言 今天登录GPT时发现openai的官网显示其有生成图片的模型DALL-E3&#xff0c;于是想试一试其效果如何。 奈何ChatGPT只能在付费版上使用&#xff0c;但是这个DALL-E3其实免费使用。 使用途径有两个&#xff1a; new bing 进入new bing 很…

好心提醒下,幼师姐妹们要知道啊

幼师家人们在不在&#xff1f;在不在&#xff1f; 不会还有姐妹在自己写教案&#xff0c;写总结&#xff0c;写评语啥的吧&#xff0c;这个好东西真的要知道啊&#xff01;&#xff01; 只要输入关键词&#xff0c;马上就能得到你想要的内容&#xff0c;真的很强啊&#xff0…