C++程序变量的引用

        在C++中,变量的“引用” 就是变量的别名,因此引用又称为别名。由于引用不是独立的变量,编译系统不给它单独分配存储单元,因此在建立引用时只有声明,没有定义,只是声明它和原有的某一变量的关系。

一、引用变更示例

1.1 示例

        这里定义一个独立的变量a,和两个引用变量b和c,代码如下:

#include <iostream>
using namespace std;
int main(){int a = 10;            //定义变量aint &b = a;            //声明引用变量bint &c = b;            //声明引用变量c// 修改a的值a =  a * a;				// 10 * 10 =100// 输出a结果cout <<"a = " <<a <<endl;// 修改b的值b = b / 5;				// 100 / 5 = 20// 输出a, b, c的结果cout <<"a = " <<a <<", b = " <<b  <<", c = " <<c <<endl;return 0;
}

        结出结果如下:

1.2 图解

        如上图,不管操作变量a,还是引用变量b 或 c,实际操作的值都是变量a存储单元中的值,最终三个变量输出结果都是一致的。

1.3 输出引用的地址

        引用与其所wager变量共享同一个存储单元,系统并不为引用另外分配存储空间。实际上,编译系统使用引用和其代表的变量具有相同的地址,代码如下:

#include <iostream>
using namespace std;
int main(){int a = 10;int &b = a;int &c = b;a =  a * a;				// 10 * 10 =100// 输出a结果cout <<"a = " <<a <<endl;b = b / 5;				// 100 / 5 = 20// 输出b的结果cout <<"a = " <<a <<", b = " <<b  <<", c = " <<c <<endl;// 输出地址cout <<"a = " <<&a <<", b = " <<&b  <<", c = " <<&c <<endl;return 0;
}

        输出结果如下:

        由上图可见,变量a和引用变量b、c的输出变量地址是一致的。

二、引用作为函数参数

        C++的参数传递分为两种形式:

  • 传值方式调用 
  • 引用方式调用

2.1 传值方式

        将值传给形参是单向传递的,在执行函数期间形参值发生变化并不传回给实参,因为在调用 函数时,形参和实参不是同一个存储单元。代码如下:

#include <iostream>
using namespace std;/*** 交换值*/
void swap(int x, int y){int temp;temp = x;x = y;y = temp;
};int main(){int a = 10, b = 20;cout <<"Original value: a = " <<a <<", b = " <<b <<endl;//交换值swap(a, b);// 输出值cout <<"New value: a = " <<a <<", b = " <<b <<endl;return 0;
}

        输出结果如下:

        可以看出,通过形参传入到swap()函数中的实参a和b的值进行了互换,但是在执行完swap(a, b)后,x和y的值改变不会影响到a和b的值。

2.2 引用方式

        为了解决上面问题,x和y值的改变同时,a和b的值也可以一起被更新。C++把变量的引用传给函数形参,利用“引用形参”实现两个变量的值互换。

        将2.1代码中的swap(int x, int y)的形参前面分别加上&符号即可,代码如下:

#include <iostream>
using namespace std;/*** 交换值*/
void swap(int &x, int &y){int temp;temp = x;x = y;y = temp;
};int main(){int a = 10, b = 20;cout <<"Original value: a = " <<a <<", b = " <<b <<endl;//交换值swap(a, b);// 输出值cout <<"New value: a = " <<a <<", b = " <<b <<endl;return 0;
}

        输出结果如下:

        由此可见,swap()内部的x和y值互换同时,a和b的值也互换了。这是因为将实参地址传给引用型形参,这时形参与实参是指向同一个存储单元。

三、对引用的细节注意

3.1 不能建立void类型的引用。

void &a = 9;            //错误

3.2 不能建立引用的数组。

char c[6] = 'hello';
char &d[6] = c;            //错误

3.3 可以将变量的引用的地址赋给一个指针,此时指针指向的是原来的变量。

int a = 10;
int &b = a;
// 指针变量p指向变量a的引用b,相当于指向a,是正确的
int *p = &b;// 注意下面写法是错误的,会报错误:[Error] invalid conversion from 'int*' to 'int' [-fpermissive],左侧必须为指针变量。
int p = &b;

3.4 可以建立指针变量的引用。

int a = 5;
// 定义指针变量指向a
int *p = &a;
// q是一个指向整型变量的指针变量的引用,初始化值为p
int * &q = p;

3.5 可以用const对引用加以限定,不允许改变该引用的值。

int a = 20;
// 声明常引用,不允许改变b的值
const int &b = a;// 常引用的值是不能改变的,所以以下写法是错误的
b = 15;            //执行会报错[Error] assignment of read-only reference 'c'// 但是变量a是可以被修改的,因为其未被const修饰
a = 15;            //可以正常执行

3.6 可以用常量或表达式对引用进行初始化,但此时必须用const作声明。

int a = 30;
const &b = a;                //合法double c = 3.1415926;
// 先将double类型变量c 转换为int型,存放在int temp = 3中,然后引用变量a指向temp
// 注:如果前面不加const会报错:[Error] cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
const int &d = c;            //合法

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

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

相关文章

企业员工培训考试系统开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着企业对员工培训的重视程度不断提高&#xff0c;传统的线下培训方式已经无法满足现代企业的需求。为了提高培训效果&#xff0c;降低培训成本&#xff0c;需要开发一款企业员工培训考试系统&#xff0c;通过在线课…

马蹄集oj赛(双周赛第二十三次)

目录 数列分割 小码哥的地毯 小码哥的三色墙 palace 高数考试 新全排列 黑白双煞 等差 数三角形 区间修改 相对马高 小码哥剪绳子 数列分割 难度:黄金 时间限制:1秒巴 占用内存:64 M 小码哥给你一个长度为n的数列&#xff0c;求将该数列分割成两个左右两个部分且两…

OceanPen Art AI绘画系统 运营教程(二)AI视频AI创作PPT

在一个崇高的目标支持下&#xff0c;不停地工作&#xff0c;即使慢&#xff0c;也一定会获得成功。 —— 爱因斯坦 演示站点&#xff1a; ai.oceanpen.art 官方论坛&#xff1a; www.jingyuai.com 登陆后台 ppt密匙设置 导航菜单配置 Key池管理 二、前端显示 体验站点…

Unity 创建快捷方式开机自动启动

Unity 创建快捷方式自动启动 &#x1f32d;食用方法 &#x1f32d;食用方法 先导入插件包&#x1f448;&#xff0c;再 把导入的ZYF_AutoRunApp.cs 挂到物体上即可。 using System; using System.Collections; using System.Collections.Generic; using System.IO; using Uni…

哲♂学家带你深♂入了♂解结构体及结构体内存大小问题

目录 概要 一、结构体的声明 二、结构体变量的创建和初始化 三、结构体的特殊声明 四、结构体内存对齐 1、对齐原则 2、例一 对齐数 计算方法 3、例二 总结 概要 结构体是我们日常编程中经常要用到的一种自定义类型&#xff0c;使用起来也是十分的方便。接下来就由…

计算机二级Python题目3

题目来源&#xff1a;计算机二级Python半个月抱佛脚大法&#xff08;内呈上真题版&#xff09; - 知乎 目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle绘图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 a,b,ceval(input()) ls[] for i in …

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Jmeter测试计划

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

P2799 国王的魔镜

题目链接&#xff1a;国王的魔镜 - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;判断回文 题意&#xff1a; 分析&#xff1a;先判断是否是2的倍数&#xff0c;再判断回文 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; char a[10000…

diffusion model(十四): prompt-to-prompt 深度剖析

infopaperPrompt-to-Prompt Image Editing with Cross Attention Controlgithubhttps://github.com/google/prompt-to-promptOrg:Google Research个人复现https://github.com/myhz0606/diffusion_learning个人博客主页http://myhz0606.com/article/p2p 1 前言 基于扩散模型&a…

基于python+vue食品安全信息管理系统flask-django-nodejs-php

食品安全信息管理系统设计的目的是为用户提供食品信息、科普专栏、食品检测、检测结果、交流论坛等方面的平台。 与PC端应用程序相比&#xff0c;食品安全信息管理系统的设计主要面向于用户&#xff0c;旨在为管理员和用户提供一个食品安全信息管理系统。用户可以通过APP及时查…

乐得瑞科技PD协议芯片:OTG与充电并行,引领数据交互

在科技日新月异的今天&#xff0c;数据交互的方式对于我们的日常生活和工作都起到了至关重要的作用。但在OTG技术诞生之前&#xff0c;这一过程却显得相当繁琐和耗时。想象一下&#xff0c;你需要将数码相机的照片导入到笔记本电脑中&#xff0c;却不得不频繁地拔出内存卡&…

流畅的 Python 第二版(GPT 重译)(一)

前言 计划是这样的&#xff1a;当有人使用你不理解的特性时&#xff0c;直接开枪打死他们。这比学习新东西要容易得多&#xff0c;不久之后&#xff0c;活下来的程序员只会用一个容易理解的、微小的 Python 0.9.6 子集来编写代码 。 Tim Peters&#xff0c;传奇的核心开发者&am…

vuex - 21年的笔记 - 后续更新

vuex是什么 Vuex是实现组件全局状态&#xff08;数据&#xff09;管理的一种机制&#xff0c;方便的实现组件之间的数据的共享 使用vuex统一管理状态的好处 能够在vuex中集中管理共享的数据&#xff0c;易于开发和后期维护能够高效地实现组件之间的数据共享&#xff0c;提高…

【Unity】层(Layer)详解

1.什么是Layer? 我们在做游戏开发的时候&#xff0c;尤其是场景比较复杂的时候&#xff0c;我们就需要使用Layer来分类。 比如&#xff1a; 排除不被灯光照亮的Layer 射线检测特定的 Layer 摄像机只能看到某些 Layer 对象之间的碰撞检测 Layer … 2.添加Layer ①在Inspecto…

C++ vector 删除

erase函数原型 iteratorerase(iterator position);//a.erase(p)&#xff0c;删除迭代器p所指向的元素,a为容器对象 iteratorerase(iterator first, iterator last);//a.erase(b,c)&#xff0c;删除迭代器b,c区间内的元素,a为容器对象 //返回值都是一个迭代器&#xff0c;该迭代…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

论文翻译 - Do-Not-Answer: A Dataset for Evaluating Safeguards in LLMs

论文链接&#xff1a;https://arxiv.org/pdf/2308.13387.pdf 项目代码&#xff1a;https://github.com/libr-ai/do-not-answer Do-Not-Answer A Dataset for Evaluating Safeguards in LLMs Abstract1 Introduction2 Related Work2.1 Studies in Specific Risk Areas2.2 Holist…

2024年03月CCF-GESP编程能力等级认证C++编程一级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 C++表达式 (3 - 2) * 3 + 5 的值是( )。 A. -13 B. 8 C. 2 D. 0 答案:B 第 2 题 C++语句 cout << “5%2=” <&l…

统计单词数

统计单词数 题目描述 一般的文本编辑器都有查找单词的功能&#xff0c;该功能可以快速定位特定单词在文章中的位置&#xff0c;有的还能统计出特定单词在文章中出现的次数。 现在&#xff0c;请你编程实现这一功能&#xff0c;具体要求是&#xff1a;给定一个单词&#xff0…