<c++> &引用概念 | 引用用法 | 引用与指针区别

简介: <c++> &引用概念 | 引用用法 | 引用与指针区别

前言


在指针的学习中,我们了解到,c和c++可以使用符号&来指示变量的地址。指针的介绍


在c++中,&符号被赋予了另一个含义,将其用来声明引用。


什么是引用


Q:什么是引用?

A:引用是已定义的变量的别名(另一个名称)。通俗来讲,就相当于起一个外号。


Q:引用语法是什么样的?

A:语法:数据类型& 引用名 = 引用实体;


举个例子:

如果我们要将a作为b变量的别名,可以这样做:


int a;
  int & b = a;


注意:&不是地址运算符,而是类型标识符。它是放在数据类型后面的。


案例


#include <iostream>
using namespace std;
int main(void)
{
    int a = 100;
    int & b = a;
    //输出值
    cout << a << endl;
  cout << b << endl;
  //值加一
  a++;
  //输出值
    cout << a << endl;
  cout << b << endl;
  //输出地址
  cout << &a << endl;
  cout << &b << endl;
    return 0;
}


运行结果:



结论: 通过观察运行结果,我们发现,a与b的值和地址都完全相同,将a加一会同时影响到两个变量。


引用的特性


引用必须先进行初始化

引用不同于指针,必须要在声明引用前将其进行初始化,不能像指针一样,先声明,再赋值。

int a = 100;
    int & b;
    b = a;  //错误!


引用一旦引用了一个实体,就不能引用其他实体

引用一但与一个实体关联起来,以后就不能进行改动了。

一个变量可以有多个引用


引用的作用


引用可以用作函数参数


Q:什么是按引用传递?

A:引用经常被用作函数参数,让函数中的变量名成为调用程序中的变量的别名,这种传递参数的方法叫做按引用传递。按引用传递可以让被调用的函数访问调用函数中的变量。


案例


#include <iostream>
using namespace std;
void swap1(int &m, int &n) {
    int temp = m;
    m = n;
    n = temp;
}
void swap2(int *m,int *n) {
  int temp;
  temp = *m;
  *m = *n;
  *n = temp;
}
int main(){
    int a = 1, b = 100;
    cout<<"before: a="<<a<<", b="<<b<<endl;
    swap1(a,b);
    cout<<"after: a="<<a<<", b="<<b<<endl;
    swap2(a,b);
    cout<<"after: a="<<a<<", b="<<b<<endl;
}

在这里我们将引用变量作为函数的形参,与指针作为形参类似,直接在函数内部对输入的参数进行修改,实现了交换操作。通过对比指针交换可以发现,引用变量在使用的时候比指针要简洁一些,变量本身就代表了引用的数据,而指针则需要加上*。


引用可以用作函数返回值


在讲引用作为函数返回值之前,我们先了解一下传统的函数是如何传递返回值的吧。


普通传值返回


int Add(int a, int b) {
    int c = a + b;
    return c;
}
int main(void)
{
    int ret = Add(1, 2);
    cout << ret << endl;
    return 0;
}


在这个例子里,return时会生成一个临时变量,把c的值赋给这个临时变量,再返回给ret。

如果我们直接将c返回给ret,很难说返回的是3还是随机值,一切都取决于编译器了。


Q:生成的临时变量存放在什么位置呢?


A: 预备返回的变量小则用寄存器存储。

A: 变量大则创建函数栈帧的时候预先为返回值创建存储空间。


引用传值返回


int &Add(int a, int b) {
    int c = a + b;
    return c;
}
int main(void)
{
    int &ret1 = Add(1, 2);
    cout << ret1 << endl;
    return 0;
}


如果我们使用引用,那我们就不需要额外的临时空间和额外的操作,因为我们是通过引用直接对实体进行操作的,这可以很好的提高程序的效率。


引用与指针的区别


引用是在概念上定义一个变量的别名,而指针是存储一个变量的地址。

引用必须从一而终,不能再指向其他数据;指针可以随意改变指向。

引用在定义时必须初始化,而指针是最好初始化,不初始化也不会报错。

指针可以有多级,引用不可以。

存在空指针,但是不存在空引用。


相关文章
|
5月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
525 132
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
5月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
528 12
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
|
10月前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
1275 0
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
346 3
【C++】map、set基本用法
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
|
存储 数据可视化 C++
第九问:能否尽可能详细阐述指针和引用的区别?
在C++中,指针和引用是两个重要的概念,用于操作内存地址和数据。指针是一个存储内存地址的变量,可以动态分配和释放内存;引用是变量的别名,绑定后不可改变指向。指针提供更大的灵活性和控制力,适用于复杂内存操作;引用更直观,适合简化代码并提高可读性。根据实际需求选择合适的工具。
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1334 13
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
612 4