【C++】C++ 引用详解 ⑦ ( 指针的引用 )
文章目录
- 一、二级指针可实现的效果
- 二、指针的引用
- 1、指针的引用 等同于 二级指针 ( 重点概念 )
- 2、引用本质 - 函数间接赋值简化版本
- 3、代码示例 - 指针的引用
一、二级指针可实现的效果
指针的引用 效果 等同于 二级指针 , 因此这里先介绍 二级指针 ;
使用 二级指针 作为参数 , 可以实现如下功能 :
- 动态内存管理 : 借助二级指针 , 可以在函数中分配或释放内存 ; 如 : 创建一个动态数组或调整现有数组的大小 , 在函数中需要一个指向指针的指针作为参数 , 以便修改原始指针 ;
void createArray(int **arr, int size) { *arr = malloc(size * sizeof(int));
}
- 修改指针的值 : 借助二级指针 , 可以在函数中修改指针的值 , 即改变它所指向的地址 ; 如果直接传递 一级指针 , 函数只能修改指针指向内存中的数据 , 指针的指向不会改变 ;
void changePointer(int **ptr) { int new_value = 10; *ptr = &new_value; // 修改指针值
}
- 传递多维数组 : C 语言中 , 数组名本质上是指向数组第一个元素的指针 , 传递多维数组到函数中通常需要传递一个指向指针的指针 , 即二级指针 ; 借助二级指针 , 函数可以修改原始数组的行指针 ;
void process2DArray(int **array, int rows, int cols) { //...
}
二、指针的引用
1、指针的引用 等同于 二级指针 ( 重点概念 )
普通变量的 引用 , 调用时可以直接当做 普通变量 使用 , 可实现的功能 相当于 一级指针 ;
- 普通变量 相当于 零级指针 ;
一级指针的 引用 , 调用时可以直接当做 一级指针 使用 , 可实现的功能 相当于 二级指针 ;
N 级指针的 引用 , 调用时可以直接当做 N 级指针 使用 , 可实现的功能 相当于 N + 1 级指针 ;
在 C++ 语言 中 , 使用 引用 时 , C++ 编译器 会自动将 引用 翻译为 一级指针 使用 , 自动 在 一级指针 变量 旁边加上 取地址符号 & 和 取值符号 * ;
指针的引用 就相当于 二级指针 , 其 实现的效果 , 等同于 二级指针 ;
C++ 编译器 遇到 指针的引用 时 , 会自动将 引用指针 转为 二级指针 ;
2、引用本质 - 函数间接赋值简化版本
使用函数进行间接赋值 , 需要满足如下三个条件 :
- 函数中定义 指针类型 的 形参 , 调用函数时 修改函数外的 实参 ;
- 将 实参 取地址 , 传递给 函数 ;
- 在函数中 , 通过指针修改 实参的值 , 以达到修改外部变量的效果 ;
如果将 函数 的形参类型 设置为 引用 类型 , 也能达到 间接赋值 的效果 ;
引用 实际上是 把 间接赋值 的三个条件的后两个条件进行了合并 , C++ 编译器遇到引用 , 还是需要将 引用 还原为 C 语言中的 取地址 传入函数 , 在函数内部使用指针访问实参 ;
3、代码示例 - 指针的引用
该 函数 的 参数 是 一级指针的引用 , 使用该参数时 可以当做 一级指针使用 , 其效果 等同于 二级指针 ; 其效果等同于上一篇博客 【C++】C++ 引用详解 ⑥ ( 普通变量 / 一级指针 / 二级指针 做函数参数的作用 ) 中的 int getStudent(Student** stu) 函数 ;
// 参数是 一级指针的引用
// 该参数 是 一级指针的引用
// 使用该参数时 可以当做 一级指针使用
// 其效果 等同于 二级指针
int getStudent(Student*& p)
调用该 一级指针 的 引用 , 可以直接访问 一级指针 , 不需要使用 * 符号 ;
因此 这里 直接为 一级指针 进行内存分配 ;
如果此处是二级指针 , 需要先试用 * 符号 取出二级指针指向的一级指针 , 然后再为该 一级指针 分配内存 ;
// 为形参中声明的 Student* 指针的引用 分配内存// 一维指针的引用 相当于直接访问一维指针 // 相当于为 main 函数中的 Student* stu 变量赋值p = (Student*)malloc(sizeof(Student));// 如果传入的是二维指针参数 Student** p// 上述操作等同于// *p = (Student*)malloc(sizeof(Student));
代码示例 :
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;struct Student
{char name[64];int age;
};// 参数是 指针的引用
// 该参数 是 一级指针的引用
// 使用该参数时 可以当做 一级指针使用
// 其效果 等同于 二级指针
int getStudent(Student*& p)
{// 为形参中声明的 Student* 指针的引用 分配内存// 一维指针的引用 相当于直接访问一维指针 // 相当于为 main 函数中的 Student* stu 变量赋值p = (Student*)malloc(sizeof(Student));// 如果传入的是二维指针参数 Student** p// 上述操作等同于// *p = (Student*)malloc(sizeof(Student));if (p == NULL){// 分配内存失败 , 返回错误码 2return 2;}// 设置结构体成员值p->age = 18;// 执行成功return 0;
}int main() {// 声明 Student 对象Student* stu = NULL;// 调用函数 将二级指针传入函数 // 在函数内部创建 Student 对象getStudent(stu);// 打印结构体成员printf("stu->age = %d\n", stu->age);// 控制台暂停system("pause");return 0;
}
执行结果 :
stu->age = 18
请按任意键继续. . .

相关文章:
【C++】C++ 引用详解 ⑦ ( 指针的引用 )
文章目录 一、二级指针可实现的效果二、指针的引用1、指针的引用 等同于 二级指针 ( 重点概念 )2、引用本质 - 函数间接赋值简化版本3、代码示例 - 指针的引用 一、二级指针可实现的效果 指针的引用 效果 等同于 二级指针 , 因此这里先介绍 二级指针 ; 使用 二级指针 作为参数 …...
ubuntu安装goland
下载并解压goland sudo tar -C /opt/ -xzvf goland-2023.1.3.tar.gz配置应用图标 新建文件: vim /usr/share/applications/goland.desktop文件中写入如下内容: [Desktop Entry] TypeApplication NameGoLand Icon/opt/GoLand/bin/goland.png Exec/op…...
海康摄像头通过SDK接入到LiveNVR实现双向语音喊话对讲与网页无插件播放,并支持GB28181级联语音对讲...
目录 1、确认摄像头是否支持对讲2、摄像头视频类型复合流3、通道配置SDK接入4、视频广场点击播放5、相关问题 5.1、如何配置通道获取直播流?5.2、如何GB28181级联国标平台?6、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、确认摄像头是否支持对讲 可以访问摄…...
解锁开发中的创意:用户为中心的设计思维的力量
引言 设计思维,起源于20世纪60年代,是一种解决问题的方法。它不仅仅是设计师的专利,而是一种可以广泛应用于各种行业和领域的方法。设计思维强调了用户至中的重要性,认为任何问题的解决都应该从用户的需求出发。这种方法鼓励我们…...
python+mysql+前后端分离国内职位数据分析(源码+文档+指导)
系统阐述的是使用国内python职位数据分析系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 Flask框架和MySql数据库技术搭建系统的整体…...
uniapp封装ajax请求
import /common/api/interceptor.js; // 引入拦截器文件 export default{common:{baseUrl:"http://localhost:3000/api",data:{},header:{"Access-Control-Allow-Origin":"*","Content-Type":"application/json","Cont…...
电路原理分析2:应急照明灯电路
k是线圈,1-2(常开)和2-3(常闭)是2个触点。 1、220v交流电正常供电时,变压器触头位置提供12v的电压,这个时候,v2二极管是导通状态,所以线圈k吸合,这个时候1-2…...
构造函数内的方法 直接写在构造函数内部 与 写在prototype上 的区别
文章目录 前言区别总结 前言 以前没注意过, 去创建一个构造函数的时候, 方法都是直接写在函数内的. 在构造函数需要多次实例化的情况下有缺点, 不过幸好以前项目里的构造函数也不需要多次实例化, 缺点没有生效. 区别 为了比较, 先在构造函数内部直接书写方法, 查看实例化结果…...
系统架构主题之七:基于架构的软件设计方法及应用
1 基于架构的软件设计方法概念 关键词:ABSD、自顶向下、递归迭代、与需求同步、设计元素、视角与视图、用例和质量场景、预期和非预期等。 总的来讲,ABSD方法分为如下六个大的阶段: 1)体系结构需求阶段 相比传统软件系统设计&…...
Python-if __name__ == ‘__main__‘和collections.Mapping的用法
1.if __name__ __main__ 1.1解释 if __name__ __main__: 是 Python 中的一个常见惯用法,用于确定一个 Python 脚本是被直接运行还是被导入为模块使用。 在 Python 中,每个模块都有一个特殊的内置变量 __name__,该变量的值决定了模块的运…...
Linux 基金会宣布正式进驻中国
在 LinuxCon 2017 (北京)即将召开前夕,我们Linux 中国会同 51CTO、开源中国对 Linux 基金会执行董事 Jim Zemlin 进行了一场远跨大洋的视频专访。 在这次专访中,Jim 先生回答了几个开源界和互联网领域关注的问题,并披…...
Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例
Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例 作者:安静到无声 个人主页 目录 Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例1. 准备工作2. 读取JSON数据3. 配置图形选项4. 构造数据5. 实验结果推荐专栏在本文中,我们将学习如何使用…...
软考高级系统架构设计师系列论文第100篇:论软件的可维护性设计
软考高级系统架构设计师系列论文第100篇:论软件的可维护性设计 一、摘要二、正文三、总结一、摘要 2020年3月1日至12月20日,我参加了“数据安全访问平台”项目的开发,担任系统分析员的工作。该项目是某行业用户“数据中心二期”建设的主要内容,目标是:建立数据统一访问接口…...
curl 使用发送POST GET请求 HEADER设置
curl 使用发送POST GET请求 HEADER设置 文章目录 Get请求POST请求1. application/x-www-form-urlencoded2. Multipart/form-data3. application/json4. text/xml 文件内容作为提交的数据 curl 设置自定义HEADER 头注意事项:shell批处理外传 Get请求 get请求偏简单&…...
使用 Transformer 和 Amazon OpenSearch Service 构建基于列的语义搜索引擎
在数据湖中,对于数据清理和注释、架构匹配、数据发现和跨多个数据来源进行分析等许多操作,查找相似的列有着重要的应用。如果不能从多个不同的来源准确查找和分析数据,就会严重拉低效率,不论是数据科学家、医学研究人员、学者&…...
算法通关村第九关——透彻理解二分查找
1.前言 常见的查找算法有顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找等。如果进行归类,那么二分查找、插值查找(一种查找算法)以及斐波那契查找都可以归为插值查找(大类)。而插值查找…...
【字节跳动青训营】后端笔记整理-4 | Go框架三件套之GORM的使用
**本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金。 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 *MySQL:8.0 本文介绍Go框架三…...
【TI毫米波雷达笔记】UART串口外设配置及驱动(以IWR6843AOP为例)
【TI毫米波雷达笔记】UART串口外设初始化配置及驱动(以IWR6843AOP为例) 最基本的工程建立好以后 需要给SOC进行初始化配置 int main (void) {//刷一下内存memset ((void *)L3_RAM_Buf, 0, sizeof(L3_RAM_Buf));int32_t errCode; //存放SOC初…...
C#---第十九课:不同类型方法的执行顺序(new / virtual / common / override)
本文介绍不同类型的方法,在代码中的执行顺序问题: 构造方法普通方法(暂用common代替)、虚方法(Virtual修饰)、New方法(new修饰)三个优先级相同overide方法(会替换virtual…...
[pytorch]torch.cuda用法以及判断显卡是不是存在问题
常见用法: torch.cuda.is_available() # 查看是否有可用GPU torch.cuda.device_count() # 查看GPU数量 torch.cuda.get_device_capability(device) # 查看指定GPU容量 torch.cuda.get_device_name(device) # 查看指定GPU名称 torch.cuda.empty_cache() # 清空程序占…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
