C++之引用、指针引用、常引用

news2024/11/20 10:28:49

引用

  • 引用的概念
  • 引用的定义
  • 引用的使用
  • 引用的应用
  • 引用的本质(就是C++内部的一个常指针(type * const 名))
  • 指针引用(其类型还是指针type *)
  • 常引用(采用const修饰的引用)

引用的概念

1、通常我们说的引用指的是“左值引用”,顾名思义就存在右值引用咯,先不展开。
2、引用就是为已经存在的变量起别名,必须是已经声明存在的变量才可以
3、引用也是C++中的一种复合类型
4、引用只是C++的特性,C中是不存在的

引用并不是对象,它只是为已经存在的对象起了一个别名而已

引用的定义

假设有变量
int b = 100;
int &a = b;//a指向b,即a是b的另一个名字
但是下面的使用是不对的:
int &a;
引用必须要被初始化

那申明引用为何一定要初始化呢?

因为引用只是已存在变量的别名,我们在初始化变量的时候是将初始值拷贝到新建的对象中,然而在声明引用的时候,需要将引用和它的初始值对象一直绑定,因为引用是不可能绑定到另一个对象上的,因此必须初始化。

并且引用的定义是可以在一条语句中定义多个引用的,其中每个引用都是以&开头,如下:

int a = 100,b = 200;
int c = 100,d = 200;
int &r = a,c = b;
int &e = c,&f = d;

那么给定义引用之后获取到的值、地址又是什么样的?

引用的使用

由下图可知:

1、为引用赋值,就是将值赋给与引用绑定的对象
2、引用与其绑定的对象的值和地址都是相同的
在这里插入图片描述

引用的应用

普通引用在声明时必须用其它的变量进行初始化
引用作为函数参数声明时不进行初始化

以交换两个数x/y的值为题来看,代码如下:

#include <stdio.h>
#include <stdlib.h>
//众所周知这种方式不能交换两个数的数值
void swap(int a, int b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
//方式一, 使用指针完全可以
void swap1(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
//方式二, 使用引用完全可以
void swap2(int &a, int &b)
{
	int tmp = a;
	a = b; 
	b = tmp;
}
int main(void){
	int x = 10, y = 100;
	//swap1(&x, &y);//x = 100,y = 10
	swap2(x, y);//x = 100,y = 10
	printf("x: %d, y: %d\n", x, y);
	system("pause");
	return 0;
}

引用之所以能体现出指针的效果,是因为修改引用的值就是修改与其绑定对象的值。

引用的本质(就是C++内部的一个常指针(type * const 名))

对于同一块内存空间而言可以取好多个名字(即对同一个变量可以取多个别名),而且引用还有自己的空间。综合来看指针很像常指针。
int a = 200;
int &b = a;
const int * c = &a;
a是一个变量,b是该变量的别名,c是一个常指针指向a的地址。

即:Type& name<-->const Type* name,Type是对应的数据类型

我们通过常指针改变交换两个变量数值的函数如下:

void swap1(int * const a, int * const b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
int main(void){
	int x = 10, y = 100;
	swap1(&x, &y);
	printf("x: %d, y: %d\n", x, y);//x = 100,y = 10
	system("pause");
	return 0;
}

C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同

指针引用(其类型还是指针type *)

命名规范:Type * &引用名 = 指针名
意思为:指向指针变量的引用,其还是一个指针变量(更简单的说法是:指针引用就是给指针起个别名
简单使用如下:
p和其引用q都是指针变量

#include <stdio.h>
#include <stdlib.h>
int main(void){
	int x = 666;
	int *p = &x;
	int * &q = p;
	printf("*p: %d, *q: %d\n", *p, *q);//666,666
	system("pause");
	return 0;
}

它的使用有什么好处呢?当然有,跟二级指针相关,使用二级指针可以将变量带入被调函数也可以带出被调函数,以下面举例:

#include <stdio.h>
#include <stdlib.h>
void boy_home(int **meipo){
	static int boy = 23;
	//*meipo~ &meipo
	*meipo = &boy;
}
//指针的引用
void boy_home1(int* &meipo){
	static int boy = 23;
	meipo = &boy;
}
int main(void){
	//声明空指针
	int *meipo = NULL;
	//一直指针的地址就是二级指针的值
	//boy_home(&meipo);
	boy_home1(meipo);
	//打印meipo这个一级指针上面的值
	printf("boy: %d\n", *meipo);
	system("pause");
	return 0;
}

常引用(采用const修饰的引用)

语法:const Type& name = var;
常引用有两种声明的形式:
第一种是:用变量初始化常引用
int a = 100;
const int &b = a;
第二种是:用字面量初始化常量引用
const int a = 100;
const int &b = a;

int main(void){ 
int a = 10;
//int &b = a;//可以通过引用去改变与其绑定的变量对象的值
//1.用变量初始化常引用
const int &b = a;
//常引用是让变量引用变成只读,不能通过引用对变量进行修改
//b = 100; 
printf("a: %d\n", a);
//2.用字面量初始化常量引用
const int c1 = 10;
//这个是在C++中,编译器会对这样的定义的引用分配内存,这算是一个特例
//const int &c2 = 10; //尽量不要这么写
const int &c2 = c1; //可以这么写
//c2 = 100;//不能修改
system("pause");
return 0;
}

常量引用不能用来修改与其绑定的变量的值,因为有const关键词修饰

const 引用结论:
1)常引用const int & e 相当于常指针const int * const e(引用的底层就是常指针)
2)普通引用相当于int *const e1
3)当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,
并将引用名作为这段空间的别名
4)使用字面量对const引用初始化后,将生成一个只读变量

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

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

相关文章

和鲸社区数据分析每周挑战【第九十五期:奈飞股价预测分析】

和鲸社区数据分析每周挑战【第九十五期&#xff1a;奈飞股价预测分析】 文章目录 和鲸社区数据分析每周挑战【第九十五期&#xff1a;奈飞股价预测分析】一、前言1、背景描述2、数据说明3、数据集预览 二、数据读取和数据预处理三、历史股价数据可视化四、利用sklearn中LinearR…

Linux 系统下的df、du、fdisk、lsblk指令

文章目录 1 查看磁盘与目录容量&#xff08;df、du&#xff09;2 查看磁盘分区&#xff08;fdisk、lsblk&#xff09;3 df、du、fdisk、lsblk的区别 1 查看磁盘与目录容量&#xff08;df、du&#xff09; df -h //列出文件系统的整体磁盘使用量在显示的结果中要特别留意根目录…

安洵杯2023 部分pwn复现

1. harde_pwn 漏洞点&#xff1a; 覆盖printf的返回地址 from pwn import * from LibcSearcher import LibcSearcher from sys import argv from Crypto.Util.number import bytes_to_long import os def ret2libc(leak, func, path):if path :libc LibcSearcher(func, leak…

二级Python考试环境安装教程

二级Python考试环境 Python3.5.3至Python3.9.10版。为方便考生学习与考点备考&#xff0c;现提供二级Python应用软件的网络下载&#xff0c;广大考生和考点管理员可以下载使用 软件包下载&#xff08;62.18 MB&#xff09; https://www.123pan.com/s/y4HrVv-0S0lA.html 安装…

在windows11环境下安装CUDA11.6+Anaconda3+pyToach1.13搭建炼丹炉

0.电脑环境 系统&#xff1a;win11 显卡&#xff1a;NVIDIA GTX1650 还有一个pyCharm&#xff0c;其他也用不到了&#xff0c;需要的文章中会进行说明 1.安装CUDA11.6 目前2023.03出来的pyToach2.0是用不到了&#xff0c;因为最低版本支持CUDA11.7。我的显卡是1650&#xff0c…

leetcode数据库题第八弹(免费题刷完了)

leetcode数据库题第八弹&#xff08;免费题刷完了&#xff09; 1757. 可回收且低脂的产品1789. 员工的直属部门1795. 每个产品在不同商店的价格1873. 计算特殊奖金1890. 2020年最后一次登录1907. 按分类统计薪水1934. 确认率1965. 丢失信息的雇员1978. 上级经理已离职的公司员工…

WebRTC音视频会议底层支撑技术

WebRTC允许应用使用P2P通信。WebRTC是一个广泛的话题&#xff0c;在本文中&#xff0c;我们将重点讨以下问题。 为什么Web RTC 如此受欢迎&#xff1f; 在P2P连接过程中会发生什么 信号传递 NATs和ICE STUN & TURN服务器 VP9视频编解码器 WebRTC APIs 安全 1.为什…

科技资讯|苹果新专利曝光:手势增强用户的交互体验

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的最新清单&#xff0c;苹果公司获得了一项编号为 US 20230195237 A1 的专利&#xff0c;展示了使用手势导航用户界面的交互体验。 苹果这项专利涉及 iPhone、iPad、Apple Watch 和 Mac&#xff0c;使用屏幕生成组件和…

Typora的安装和授权(2023)

文章目录 1. 文章引言2. Typora的下载3. Typora的安装4. Typora的授权 1. 文章引言 我们在开发的过程中&#xff0c;不可或缺地要使用到markdown文本&#xff0c;支持markdown文本的编辑器有很多&#xff0c;其中Typora便是一款不错的编辑器。 不过&#xff0c;Typora是收费的…

知行之桥EDI系统QA第二期:AS2专题

随着使用知行之桥EDI系统的用户群体日益壮大&#xff0c;在使用过程中&#xff0c;用户可能对系统的工作原理、功能模块和实施过程有一些疑问。近期整理了有关 AS2 的四个常见问题&#xff1a; 1.知行之桥 EDI系统支持AS2 协议的 AES_GCM 算法吗&#xff1f;2.AS2发送文件后收…

C++不知算法系列之计数排序算法的计数之巧

1. 前言 计数排序是较简单的排序算法&#xff0c;其基本思想是利用数组索引号有序的原理。 如对如下的原始数组中的数据(元素)排序&#xff1a; //原始数组 int nums[5]{9,1,7,6,8};使用计数排序的基本思路如下&#xff1a; 创建一个排序数组。数组的大小由原始数组的最大值…

ActiveMQ消息队列的核心概念

文章目录 ActiveMQ消息队列的核心概念1.什么是MQ消息队列2.为什么要使用MQ消息队列3.MQ消息队列的应用场景3.1.异步处理3.2.应用解耦3.3.流量削锋 4.常见的MQ消息队列产品对比 ActiveMQ消息队列的核心概念 1.什么是MQ消息队列 Message Queue消息队列简称MQ&#xff0c;消息队…

NXP i.MX 6ULL工业开发板规格书( ARM Cortex-A7,主频792MHz)

1 评估板简介 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳定可靠&#xff0c;可满足各种工业应用环境。 评估板接口资源丰富&…

AI通用大模型 —— Pathways,MoE, etc.

文章目录 Pathways现有AI缺憾Pathways Can DoMultiple TasksMultiple SensesSparse and Efficient Mixture of Experts&#xff08;MoE&#xff09;Neural Computation1991, Adaptive mixtures of local expertsICLR17, Outrageously Large Neural Networks: The Sparsely-Gate…

【已解决】ModuleNotFoundError: No module named ‘timm.models.layers.helpers‘

文章目录 错误信息原因解决方法专栏&#xff1a;神经网络精讲与实战AlexNetVGGNetGoogLeNetInception V2——V4ResNetDenseNet 错误信息 在使用timm库的时候出现了ModuleNotFoundError: No module named timm.models.layers.helpers’的错误&#xff0c;详情如下&#xff1a; …

Windows下安装ClickHouse图文教程

文章目录 1.安装WSL21.1启用适用于 Linux 的 Windows 子系统1.2启用Windows虚拟机功能1.3将WSL2设置为默认版本1.4下载Linux内核更新包1.5安装Linux子系统1.6设置账户和密码 2.安装Docker2.1下载与安装2.2设置镜像地址 3.安装Clickhouse3.1拉取镜像3.2启动clickhouse-server3.3…

Docker学习笔记7

启动一个运行httpd服务的容器&#xff1a; docker run -it --namec3 centos:latest /bin/bash 在容器中安装apache服务&#xff1a; yum install -y httpd 在这个过程中遇到一个问题&#xff1a; Error: Failed to download metadata for repo appstream: Cannot prepare …

关于PHP调用openAI chatGPT一些问题

我是直接使用gpt生成的curl代码区调用的 1&#xff1a;windows可能出现代理访问问题&#xff0c;报443端口问题 解决办法&#xff1a;开启代理后&#xff0c;需要到设置 确认这里打开状态 在curl请求里面加上对应的代码 curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1&qu…

java spring cloud 企业工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

企业运维 | NFS、Samba服务在Docker容器环境中快速搭建部署实践

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1…