【C++初阶(三)】引用详解(对比指针)(上)

简介: 【C++初阶(三)】引用详解(对比指针)

💓博主CSDN主页:杭电码农-NEO💓


⏩专栏分类:C++初阶之路


🚚代码仓库:NEO的学习日记🚚


🌹关注我🫵带你学习排序知识

  🔝🔝



1. 前言

C语言中有一利器: 指针
而C++中增加了另一利器: 引用
这两个板块的存在
极大了提升了C/C++的可用性!

本篇文章将给大家详细讲解引用
并且分析引用和指针的联系和区别
最后给大家拓展C++中的空指针


2. 引用的概念

概念:

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间

比如说孙悟空又叫
孙行者,齐天大圣,斗战胜佛

李逵又叫黑旋风,铁牛

类型& 引用变量名(对象名) = 引用实体
引用符号:&

举个例子来说明:

int a = 10;
    int& ra = a;//<====定义引用类型
    printf("%p\n", &a);//打印地址
    printf("%p\n", &ra);

打印出来的地址相同


并且引用值改变,原先的值也会改变!

int a = 10;
    int& ra = a;
    cout << ra <<' '<< a;
    cout << endl;
    ra = 20;
    cout << ra << ' ' << a;

a的值会从10被修改成20


3. 引用的特性

引用特性:

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 一旦引用一个实体,就不能引用其他实体

特性讲解:


int a = 10;
int& ra; // 没初始化,会报错
int& ra = a;
int& rra = a;
int& rrra = a;
//这三个都是a的引用,只要其中一个
//发生改变,其他三个也会改变
printf("%p %p %p %p\n", &a, &ra, &rra, &rrra);  

int a = 10;
int& ra = a;
int b = 20;
ra = b; //这条语句的意思是将b的值赋值给a
        //而不是ra从a的引用变成b的引用
cout << ra << ' ' << a << ' ' << b;
cout << endl;
printf("a的地址:%p ra的地址:%p b的地址:%p", &a, &ra, &b);

可以看见ra的地址和a是一样的
一旦引用初始化后就不能改变引用对象


4. 常引用

顾名思义就是引用常量
但是常量具有不可修改性
所以引用一个常量时要加上const

const int a = 10;
//int& ra = a;   // 该语句编译时会出错,a为常量
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量
const int& b = 10;
double d = 12.34;
//const int& rd = d; // 该语句编译时会出错,类型不同
const double& rd = d;

并且引用的类型要对上

int类型的引用对应int&

double类型的引用对应double&


5. 使用场景

5.1 引用做函数参数

引用做函数参数

之前在写C程序的交换函数时
因为形参是实参的一份拷贝
想要改变实参就要传地址
而现在有了引用就不用传地址了!

void Swap(int& left, int& right)//交换函数
{
   int temp = left;
   left = right;
   right = temp;
}
int a = 10;
int b = 20;
Swap(a,b);//因为形参为引用,所以这传的是a,b的引用

注: 引用传参时,不用加符号&

& 符号放在类型后面时是引用

其他地方& 符号都是取地址!

相关文章
|
4天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
2天前
|
C++
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
|
3天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-3
c++初阶------类和对象(六大默认构造函数的揭破)
|
3天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-2
c++初阶------类和对象(六大默认构造函数的揭破)
|
3天前
|
存储 编译器 C语言
c++初阶-------类和对象-2
c++初阶-------类和对象
|
3天前
|
安全 编译器 C语言
C++初阶------------------入门C++(三)
C++初阶------------------入门C++(三)
|
3天前
|
存储 Linux 编译器
C++初阶------------------入门C++(二)
C++初阶------------------入门C++(二)
|
3天前
|
编译器 C语言 C++
C++初阶------------------入门C++(一)
C++初阶------------------入门C++(一)
|
4天前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用
|
5天前
|
编译器 C++
【C++进阶】引用 & 函数提高
【C++进阶】引用 & 函数提高