C++之传指针、引用、vector<shared_ptr<string>>应用总结(二百三十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之传指针、引用、vector<shared_ptr>用法。

2.概念与用法

C++ 中的指针和引用是两个常用的概念,它们都用于处理变量的别名。尽管它们在使用和语法上有一些区别。

指针(Pointers)

  • 指针是一个变量,它存储了一个内存地址,指向另一个变量的位置。
  • 指针允许我们通过间接引用间接访问变量。
  • 当我们声明一个指针时,它会被初始化为空值(nullptr)或者指向另一个变量的地址。
  • 通过使用解引用运算符 *,我们可以访问指针所指向的变量的值。
  • 指针可以进行算术运算,如指针加法和指针减法。

传递指针:

int num = 42; // 声明一个整型变量 num,初始化为 42
int* p; // 声明一个整型指针 pp = &num; // 将指针 p 指向变量 num 的地址cout << *p << endl; // 解引用指针 p,输出地址所指向的值int anotherNum = 99;
p = &anotherNum; // 修改指针 p 的引用对象为另一个变量cout << *p << endl; // 输出指针 p 所指向的另一个变量的值

传递引用

  • 引用是一个与现有变量相关联的别名。
  • 引用在声明时必须被初始化,一旦引用被初始化,它就一直引用同一个变量,不能再引用其他变量。
  • 引用不需要使用特殊的符号来访问和修改变量。
  • 对引用的任何更改都会直接反映到原始变量上。
    示例:
int num = 42; // 声明一个整型变量 num,初始化为 42
int& ref = num; // 声明一个整型引用 ref,引用变量 numcout << num << endl; // 输出变量 num 的值
cout << ref << endl; // 输出引用 ref 所引用变量的值ref = 99; // 修改引用 ref 所引用的变量cout << num << endl; // 输出修改后的变量 num 的值
cout << ref << endl; // 输出修改后的引用 ref 所引用变量的值

指针和引用的主要区别:

  1. 初始化要求:指针可以为空,也可以指向任何对象,而引用必须在声明时初始化,并且不能改变其引用的对象。
  2. 重新指向:指针可以在运行时重新指向不同的对象或者空值,而引用一旦初始化后不能再引用其他对象。
  3. 空值处理:指针可以为空值(nullptr),表示指向无效对象或空指针,而引用必须引用有效对象,不存在空引用。

3.应用实例

v1.0 传值:预期效果:修改ref变量的值。

#include <iostream>int main() {int num = 42;int ref = num; std::cout << "num: " << num << std::endl;std::cout << "ref: " << ref << std::endl;ref = 99; // 通过引用修改 num 的值std::cout << "num: " << num << std::endl;std::cout << "ref: " << ref << std::endl;return 0;
}

打印:
num: 42
ref: 42
num: 42
ref: 99

  • num没有改变,没有达到预期效果

v2.0 传引用:预期效果:修改ref变量的值。

#include <iostream>int main() {int num = 42;int& ref = num; //ref引用是num的别名,改变ref的值,也就改变num的值.std::cout << "num: " << num << std::endl;std::cout << "ref: " << ref << std::endl;ref = 99; // 通过引用修改 num 的值std::cout << "num: " << num << std::endl;std::cout << "ref: " << ref << std::endl;return 0;
}

num: 42
ref: 42
num: 99
ref: 99

  • num改变,达到预期效果

v3.0 传指针:预期效果:修改ref变量的值。

#include <iostream>int main() {int num = 42;int *ref = &num; //ref指针中存放的是num的地址, 改变*ref的值,num也就改变。std::cout << "num: " << num << std::endl;std::cout << "ref: " << *ref << std::endl;*ref = 99;std::cout << "num: " << num << std::endl;std::cout << "ref: " << *ref << std::endl;return 0;
}

num: 42
ref: 42
num: 99
ref: 99

  • num改变,达到预期效果

v4.0 传指针:预期效果:通过修改指针b的值,达到修改指针a和num变量的值。

#include <iostream>int main() {int num = 10;int *a = &num;int *b = a;printf("a = %d\n",*a);printf("b = %d\n",*b);printf("num = %d\n",num);//2.通过修改指针b,达到修改指针a和num的值,因为指针b存放的是指针a和num的地址.*b = 20;printf("a = %d\n",*a);printf("b = %d\n",*b);printf("num = %d\n",num);return 0;
}

a = 10
b = 10
num = 10
a = 20
b = 20
num = 20

  • 指针a和num改变,达到预期效果

v5.0 std::vector<std::shared_ptrstd::string>插入并遍历元素

#include <iostream>
#include <vector>
#include <memory>
#include <iterator>int main() {//1.创建一个vector动态数组容器,它里面存放着指向字符串的智能指针.std::vector<std::shared_ptr<std::string>> buffers;//2.向数组中添加几个字符串,并且让指针指向它.buffers.push_back(std::make_shared<std::string>("Hello"));buffers.push_back(std::make_shared<std::string>("World"));buffers.push_back(std::make_shared<std::string>("C++"));//3.迭代器遍历访问. std::vector<std::shared_ptr<std::string>>::iterator it;  for(it = buffers.begin(); it != buffers.end(); it++){printf("it = %s\n", (*it)->c_str());}// 清空数组中的指针对象buffers.clear();return 0;
}
//注意:vector容器里存放的是智能指针类型.

v6.0 修改std::vector<std::shared_ptrstd::string>插入元素的值

#include <iostream>
#include <vector>
#include <memory>
#include <string>
#include <cstring>
using namespace std;void getInputBuffers(vector<shared_ptr<string>> *buffers){(*buffers).push_back(std::make_shared<std::string>("Hello"));(*buffers).push_back(std::make_shared<std::string>("World"));
}int main(){//v1.0vector<shared_ptr<string> > inBuffers;//获取vector容器中的指针向字符串指针.getInputBuffers(&inBuffers);printf("inBuffers = %s\n",inBuffers.at(0)->data());//v2.0 :inBuffers.at(0)为vector中第一个元素,即指向字符串"Hello"的智能指针.string buf = "1234567";//定义buffer引用指向inBuffers.at(0),通过修改引用达到,修改inBuffers.at(0)的目的.//shared_ptr<string> &buffer = inBuffers.at(0);//定义buffer传指针; buffer智能指针指向vector<shared_ptr<string>>中元素,即一个指向string类型的智能指针,//因为智能指针buffer存放inBuffers.at(0)(等同于vector中一个指向string类型的智能指针),所以改变buffer指针的值,就可以改变inBuffers.at(0)指向的值。shared_ptr<string> buffer = inBuffers.at(0);memcpy(buffer->data(), buf.data(), buf.size());printf("inBuffers = %s\n",inBuffers.at(0)->data());
}

v7.0 修改std::vector<std::shared_ptrstd::string>插入元素的值(完整版本)

#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <cstring>using namespace std;
int main() {int num = 10;int *a = &num;int *b = a;printf("a = %d\n",*a);printf("b = %d\n",*b);printf("num = %d\n",num);//2.通过修改指针b,达到修改指针a和num的值,因为指针b存放的是指针a和num的地址.*b = 20;printf("a = %d\n",*a);printf("b = %d\n",*b);printf("num = %d\n",num);//v1.0int x = 11;int &y = x;printf("x = %d\n",x);printf("y = %d\n",y);y = 22;printf("x = %d\n",x);printf("y = %d\n",y);//v2.0int *z = &y;*z = 33;printf("x = %d\n",x);printf("y = %d\n",y);shared_ptr<string> buf1 = make_shared<string>("Hello World!");printf("buf1 = %s\n",buf1->c_str());//v3.0shared_ptr<string> &buf2 = buf1;printf("buf2 = %s\n",buf2->c_str());//v4.0shared_ptr<string> buf3 = buf1;printf("buf3 = %s\n",buf3->c_str());buf2->assign("2222222");printf("buf1 = %s\n",buf1->c_str());printf("buf2 = %s\n",buf2->c_str());buf3->assign("3333333");printf("buf1 = %s\n",buf1->c_str());printf("buf3 = %s\n",buf3->c_str());//v5.0//vector<shared_ptr<string>> *buffers = new vector<std::make_shared<std::string>>("88888888888");vector<shared_ptr<string>> *buffers = new vector<std::shared_ptr<string>>;//v5.1//存放在二级指针中[0][0](*buffers).push_back(std::make_shared<std::string>("88888888888"));printf("*at(0) = %s\n",(*buffers).at(0)->data());//v5.2//存放在二级指针中[0][1]buffers->push_back(std::make_shared<std::string>("9999999"));printf("at(0) = %s\n",buffers->at(1)->data());printf("at(0) = %s\n",buffers[0][0]->data());printf("at(0) = %s\n\n",buffers[0][1]->data());//v5.3(*buffers)[0]->assign("44444");buffers[0][1]->assign("55555555");// printf("at(0) = %s\n",buffers[0][0]->data());// printf("at(1) = %s\n",buffers[0][1]->data());//v5.4vector<shared_ptr<string>> btmp1 = *buffers;vector<shared_ptr<string>> &btmp2 = *buffers;btmp2.at(0)->assign("aaaaaaaaa");btmp2.at(1)->assign("bbbbbbbbbb");// printf("at(0) = %s\n",buffers[0][0]->data());// printf("at(1) = %s\n",buffers[0][1]->data());//v6.0{char *buf = (char *)string("Hello Android!").c_str();//v6.1 buf1指针的引用,它指向buf指针.char* &buf1 = buf;printf("buf = %s\n",buf);printf("buf1 = %s\n",buf);//通过修改指针的引用buf1,达到改变buf的值.memset(buf1,0,strlen(buf1));memcpy(buf1, "Crack Data", strlen("Crack Data"));printf("buf = %s\n",buf);printf("buf1 = %s\n",buf);//v6.2 通过修改指针的buf2,达到改变buf的值.char* buf2 = buf;printf("buf = %s\n",buf);printf("buf2 = %s\n",buf);memset(buf2,0,strlen(buf2));//通过修改指针的引用buf2,达到改变buf的值.memcpy(buf2, "Hello Chromium", strlen("Hello Chromium"));printf("buf = %s\n",buf);printf("buf2 = %s\n",buf);}return 0;
}

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

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

相关文章

Spring面试题13:Spring中ApplicationContext实现有哪些?Bean工厂和Applicationcontext有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring中ApplicationContext实现有哪些? 在Spring框架中,有以下几种ApplicationContext的实现: ClassPathXmlApplicationContext:从类路径下的…

算法通过村第十关-并归|黄金笔记|手撕并归排序

文章目录 前言并归排序的原理总结 前言 提示&#xff1a;有时我会担心你们发现我其实很普通。爱并不需要你与众不同。--查理麦克西《男孩、鼹鼠、狐狸和马》 并归排序算是经典的分治思想中的问题&#xff0c;这个非常典型的题目。 并归排序的原理 并归排序&#xff0c;简单来说…

Shiro高级及SaaS-HRM的认证授权

Shiro在SpringBoot工程的应用 Apache Shiro是一个功能强大、灵活的&#xff0c;开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。越来越多的企业使用Shiro作为项目的安全框架&#xff0c;保证项目的平稳运行。 在之前的讲解中只是单独的使用shiro&…

成为吃鸡战场的王者!分享顶级战术干货,助您提高战斗力!

各位吃鸡战场的玩家们&#xff0c;欢迎来到本视频&#xff01;在这里&#xff0c;我将为您呈现一些与众不同的吃鸡干货&#xff0c;帮助您提高战斗力、轻松吃鸡&#xff01; 首先&#xff0c;让我们谈一谈作图工具推荐。绝地求生作图工具是吃鸡玩家们的必备利器。我将给大家推荐…

TikTok的伦理挑战:虚拟世界与现实世界的交汇

在数字时代&#xff0c;社交媒体平台已经不再只是一个信息传播的工具&#xff0c;它已经深刻地改变了我们的社交行为、价值观和伦理观。 而在这一领域的佼佼者之一&#xff0c;TikTok&#xff0c;正面临着伦理挑战&#xff0c;这是虚拟世界与现实世界交汇的产物。 本文将深入…

CompletableFuture-线程池运行选择

如果没有传入自定义线程池&#xff0c;都用默认线程池ForkJoinPool 传入一个线程池&#xff0c;如果你执行第一个任务时&#xff0c;传入了一个自定义线程池&#xff0c; 调用thenRun方法执行第二个任务时&#xff0c;则第二个任务和第一个任务时共用同一个线程池 调用thenRun…

Linux和本地Windows如何互传文件(sz和rz指令)

目录 关于 rzsz 注意事项 安装软件 rz的使用&#xff08;本地主机文件传到Windows中&#xff09; sz的使用(Linux中的文件传到本地Windows主机中) 关于 rzsz 这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过直接拖拽的方式将文件…

计算机网络相关知识点

谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 这两种模型都是网络通信中重要的参考模型,他们的设计和功能有一些区别。 首先OSI&#xff0c;OSI七层模型&#xff0c;也被称为开放系统互联参考模型&#xff0c;是一种在国际标准化组织&#xff08;ISO&#xff09;中…

基于YOLOv8模型的蜜蜂目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的蜜蜂目标检测系统可用于日常生活中检测与定位蜜蜂目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…

SPA项目之主页面--Mock.js以及组件通信(总线)的运用

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于VueElementUI的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mock.js是什么 二.为什么要使用…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff09;功…

【Linux】线程安全

线程互斥互斥相关背景概念 互斥量mutex互斥量接口初始化互斥量函数销毁互斥量互斥量加锁互斥量解锁代码模拟 互斥量实现的逻辑常见锁的概念死锁什么叫做阻塞&#xff1f;产生死锁的四个必要条件如何避免死锁 Linux线程同步同步概念与竞态条件条件变量条件变量函数代码练习 条件…

pytest之parametrize()实现数据驱动

第一个参数是字符串&#xff0c;多个参数中间用逗号隔开 第二个参数是list,多组数据用元组类型;传三个或更多参数也是这样传。list的每个元素都是一个元组&#xff0c;元组里的每个元素和按参数顺序一一对应 传一个参数 pytest.mark.parametrize(‘参数名’&#xff0c;list)…

【Spring Boot】拦截器学习笔记

一、普通拦截器 1&#xff0c;新建类MyWebConfig实现WebMvcConfigurer&#xff0c;实现addInterceptors方法 Overridepublic void addInterceptors(InterceptorRegistry registry) {registry// 不拦截哪些请求.excludePathPatterns("/login")// 拦截哪些请求.addPat…

Kubernetes 上的数据已跨越鸿沟:在 GKE 上运行有状态应用程序的案例

Kubernetes 是当今云原生开发的事实上的标准。长期以来&#xff0c;Kubernetes 主要与无状态应用程序相关&#xff0c;例如 Web 和批处理应用程序。然而&#xff0c;与大多数事物一样&#xff0c;Kubernetes 也在不断发展。如今&#xff0c;我们看到 Kubernetes 上有状态应用程…

在docker中删除none镜像

在构建过Docker镜像的电脑上查看本地镜像列表&#xff0c;有可能看到下图红框中的镜像&#xff0c;在列表中展示为:&#xff1a; 这种镜像在Docker官方文档中被称作dangling images&#xff0c;指的是没有标签并且没有被容器使用的镜像。 官方解释 来自官方的解释如下图红框所…

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制

文章目录 配置文件一、Yaml 文件1.1 修改banner1.2 日志1.3 端口1.4 属性提示消失解决方案 二、Properties 文件三、配置高级3.1 临时属性3.2 临时属性&#xff08;开发环境&#xff09;3.3 配置文件四级分类3.3.1 原始配置文件&#xff08;四级&#xff09;3.3.2 config目录下…

Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注&#xff0c;被认为C在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C: An in-depth language comparison Rust和C的比较是开发人员最近的热门话题&#xff0c;两者之间有许多相似之处&#xff0c…

少数人的晚餐-补充

与此相关的四篇博客&#xff1a; 坦然~佛系~_坦然 佛系 zhangrelay-CSDN博客 少数人的晚餐_zhangrelay的博客-CSDN博客 ROS1/2机器人课程的价值和规模-CSDN博客 从2050回顾2020&#xff0c;职业规划与技术路径&#xff08;节选&#xff09;补充-CSDN博客 回顾 少数人的晚餐…

手把手教你制作精美的新店开业微传单

如果你准备开设一家新店&#xff0c;那么制作一份具有吸引力的微传单是宣传店铺的重要手段之一。下面&#xff0c;我们将通过乔拓云平台&#xff0c;手把手教你制作一份有吸引力的新店开业微传单。 1. 注册并登录乔拓云账号 首先&#xff0c;你需要在乔拓云官方网站注册一个账号…