【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
请按任意键继续. . .

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Arduino驱动TEMT6000传感器(光照传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 TEMT6000是一个三极管类型的光敏传感器,其光照强度和基极的电流成正比。用起来也相当简单,可以简单的连接该传感器的基极到模拟电压输入,通过简单的检测电压值就可以判断当前的光照强度。 1、

python增强现实

1&#xff0c;在一平面上放一个立方体 实现代码&#xff1a; from pylab import * from PIL import Image# If you have PCV installed, these imports should work from PCV.geometry import homography, camera # from PCV.localdescriptors import sift"""…

Python+OpenCV实现增强现实!快来召唤你的库洛牌!!!

相信大家都看过或者听过《摩卡少女樱》这部动漫&#xff0c;是不是非常羡慕小樱能够从库洛牌中召唤出各种各样会有魔法的人呀&#xff1f;&#xff01; 今天&#xff0c;博主就来教教大家如何实现召唤吧&#xff01;&#xff01;&#xff01;学会以后相信你一定可以召唤神龙滴&…

Logstash【从无到有从有到无】【简介】【L2】Logstash入门

目录 1.Logstash入门 1.1.安装Logstash 1.1.1.从下载的二进制安装 1.1.2.从包存储库安装 1.1.3.使用Homebrew在Mac上安装Logstash 1.1.4.使用Homebrew启动Logstash 1.1.5.Docker 1.2.简单使用 1.3.用Logstash解析日志 1.3.1.配置Filebeat以将日志行发送到Logstash 1…

dojo框架笔记

一、模块定义 1、定义只含值对&#xff0c;没有任何依赖的模块&#xff08;moudle1.js&#xff09; define({ color: "black", size: "unisize" }); 2、定义没有任何依赖&#xff0c;但是需要一个准备活动的函数&#xff08;moudle2.js&#xff09; define…

Flutter技术与实战(5)

Flutter进阶 文章目录 Flutter进阶如何构造炫酷的动画效果Animation、AnimationController与ListenerAnimationWidget与AnimationBuilderhero动画 单线程模型怎么保证UI运行流畅Event Loop机制异步任务异步函数Isolate HTTP网络编程与JSON解析HTTP网络编程HttpClienthttpdioJSO…

Styling FX Buttons with CSS

http://fxexperience.com/2011/12/styling-fx-buttons-with-css/ ———————————————————————————————————————————————————————— Styling FX Buttons with CSS December 20, 2011 By Jasper Potts A number of people h…

使用机器学习模型对大盘指数进行预测

作者&#xff1a;子楠 链接&#xff1a;https://zhuanlan.zhihu.com/p/24417597 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 用数学模型分析策略&#xff0c;可以避免由于情绪波动的造成的影响&#xff0c;避免一些…

大盘趋势图强弱分析 通达信大盘多空指标公式 副图不加密

判断大盘走势图的四大技巧有哪些&#xff1f; 答&#xff1a;1.消息面、政策面、经济面。2.技术面。技术面上最重要的是成交量。3.利用领涨股。一般一波行情的发展都会由一只或几只领涨股引领&#xff0c;对他们本身进行分析进而了解市场主力所盯紧的热点&#xff0c;然后判断…

通达信 红线精准主升浪波段买卖选股指标 蝶形飞扬副图公式源码

波段神器&#xff0c;无未来&#xff0c;信号极其准确,不是好用的指标不好分享给大家! 这是指标用于显示选股下单的信号,只显示安全的做多做空信号,所以信号较少,少而准!对比一下就知道了! 一个能及时提示上涨和下跌&#xff0c;有兴趣的朋友可以下载来试试&#xff01; 指标用…

R实战:【实战分析】大盘历年几月是行情?

有人说每年的5月份是下跌行情&#xff0c;11月份左右会有个吃饭行情&#xff0c;是这样的吗&#xff1f;还是用事实来说话吧 R实战系列专栏 百度云下载&#xff1a;本文R脚本和数据文件

java 获得 大盘 开盘_教你利用开盘十分钟判定当日大盘强弱(建议收藏!)

深沪两市都可以用通过市场要素快速排序的方法告诉我们市场的真正实质。市场量价要素排序的功能是专业选手快速掌握市场真正情况的窗口&#xff0c;也是专业看盘的标准次序。本文教你利用开盘十分钟判定当日大盘强弱&#xff01; 1&#xff0c;第一板个股涨幅 深沪两市都可以用通…

涨跌的例题用C语言编辑,涨跌比率指标用法及源代码(ADR)

ADR指标又叫涨跌比率指标或上升下降比指标&#xff0c;其英文全称是“Advance Decline Ratio”。和ADL指标一样&#xff0c;是专门研究股票指数走势的中长期技术分析工具。 涨跌比率ADR指标是将一定时期内上市交易的全部股票中的上涨加数和下跌加数进行比较&#xff0c;得出上涨…

北向资金能预示大盘涨跌?【附Python源码】

01 引言 中国证监会于 2014 年和 2016 年分别批准了沪港通和深港通&#xff0c;建立了大陆和香港股市的互联互通机制&#xff0c;市场通常把沪股通和深股通的合计流入资金称为北向资金。换句话说&#xff0c;北上资金就是指从香港流入大陆股市的资金&#xff0c;而内地流入香港…

利用随机森林预测股票大盘涨跌

本文仅从实战角度去观察&#xff0c;利用机器学习算法中&#xff0c;随机森林模型预测股票市场指数涨跌的准确率。 适合入门玩家 首先&#xff0c;我们导入所需要的模块 import numpy as np import pandas as pd import talib as ta #金融数据计算 import datetime,pickle …

大盘涨跌预测及仓位控制思考

今天分享一篇个人在大盘涨跌上的预测及通过涨跌预测延伸的仓位控制思考。 大盘的择时个人一直认为是股票量化中最重要的部分&#xff08;普通的策略&#xff09;。一个好的择时方法&#xff0c;虽然可能会让部分盈利变少&#xff0c;但能够大大的降低回撤。很多策略虽然有很高…

[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

Web LovePHP 你真的熟悉PHP吗&#xff1f; 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…

想要买一款手机!得先用爬虫爬取一下他的评论是否值得买!

1. 网站分析 本文实现的爬虫是抓取京东商城指定苹果手机的评论信息。使用 requests 抓取手机评论 API 信息&#xff0c;然后通过 json 模块的相应 API 将返回的 JSON 格式的字符串转换为 JSON 对象&#xff0c;并提取其中感兴趣的信息。读者可以点击此处打开 京东商城&#xf…

Web前端期末大作业-在线手机商城网站设计(HTML+CSS+JS)

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

优秀网站看前端 —— 小米Note介绍页面

刚开始经营博客的时候&#xff0c;我写过不少“扒皮”系列的文章&#xff0c;主要介绍一些知名站点上有趣的交互效果&#xff0c;然后试着实现它们。后来开始把注意力挪到一些新颖的前端技术上&#xff0c;“扒皮”系列便因此封笔多时。今天打算重开“扒皮”的坑&#xff0c;不…