C++中指针的引用*&的具体使用

 更新时间:2021年11月11日 11:25:59   作者:HUSTER593  
本文主要介绍了C++中指针的引用*&的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。

首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用。

如指针一样,指针的引用容易使人困惑。

我们注意到类似下面这种语法

void func(int *&x)
{
	++x;
}

我猜你可能对int *&x有点疑惑。

这叫做指针的引用

int *&x

不要觉得看着复杂,其实一点也不复杂。

我帮你拆开来看:

按照C++程序员的习惯,指针“*”号是和类型放在一起的。
C++中&是引用符号。
我们需要注意的是“引用”不产生副本,而是给原变量起别名。
对引用操作就是对原变量操作。

所以只需要这样:

int* &x

一目了然!

对指针变量本身的修改无法作用到原指针变量,

所以需要通过引用来实现修改指针变量。

我用两张图来告诉你指针的引用为什么有用:

在这里插入图片描述

在这里插入图片描述

什么叫局部修改?

举个栗子

我用代码来给你解释解释什么叫局部修改:

#include <stdio.h>

void swap(int* p1,int* p2) {
    int* temp=p1;
    p1=p2;
    p2=temp;
    printf("交换中:a=%d,b=%d \n",*p1,*p2);
    printf("交换中(地址):p1=%d \n",p1);
    printf("交换中(地址):p2=%d \n",p2);
}

int main() {
    int a=1,b=3;
    int *p1=&a,*p2=&b;

    // 交换前
    printf("交换前:a=%d,b=%d \n",*p1,*p2);
    printf("交换前(地址):p1=%d \n",p1);
    printf("交换前(地址):p2=%d \n",p2);
    // 交换中
    swap(p1,p2);
    // 交换后
    printf("交换后:a=%d,b=%d \n",*p1,*p2);
    printf("交换后(地址):p1=%d \n",p1);
    printf("交换后(地址):p2=%d \n",p2);
    return 0;
}

猜一猜结果。

输出的结果:

交换前:a=1,b=3
交换前(地址):p1=6422028
交换前(地址):p2=6422024
交换交换中:a=3,b=1
交换中(地址):p1=6422024
交换中(地址):p2=6422028
交换后:a=1,b=3
交换后(地址):p1=6422028
交换后(地址):p2=6422024

运行截图

在这里插入图片描述

在执行swap()函数的时候就是执行中。

在这里插入图片描述

可以发现在执行swap()函数的时候确实修改了地址,也交换了a、b的值。

在这里插入图片描述

但是,当我们在main()函数中输出a、b的时候,完全没有交换。

什么叫全局修改?

同样的代码,我只改一个地方。

在这里插入图片描述

来看看会发生什么改变。

运行截图

在这里插入图片描述

交换前:a=1,b=3
交换前(地址):p1=6422044
交换前(地址):p2=6422040
交换中:a=3,b=1
交换中(地址):p1=6422040
交换中(地址):p2=6422044
交换后:a=3,b=1
交换后(地址):p1=6422040
交换后(地址):p2=6422044

我就简简单单添加了“&”,竟然如此神奇!

所以我们可以发现:

指针的引用能够全局修改指针变量!

引用是C++中很强大的语法,在编程中极其实用。

明白这个语法很关键,因为这个在树和图的算法中应用广泛。

到此这篇关于C++中指针的引用*&的具体使用的文章就介绍到这了,更多相关C++指针的引用*&内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Visual Studio 2022最新版安装教程(图文详解)

    Visual Studio 2022最新版安装教程(图文详解)

    本文主要介绍了Visual Studio 2022最新版安装教程,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言运算符的重载详解

    C语言运算符的重载详解

    大家好,本篇文章主要讲的是C语言运算符的重载详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • VsCode搭建C语言运行环境详细过程及终端乱码问题解决方案

    VsCode搭建C语言运行环境详细过程及终端乱码问题解决方案

    这篇文章主要介绍了VsCode搭建C语言运行环境以及终端乱码问题解决,在VsCode中搭建C/C++运行环境需要先安装几个插件,具体插件文中给大家详细介绍,需要的朋友可以参考下
    2022-12-12
  • C语言与Lua之间的相互调用详解

    C语言与Lua之间的相互调用详解

    这篇文章主要给大家介绍了关于C语言与Lua之间的相互调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • C语言调试手段:锁定错误的实现方法

    C语言调试手段:锁定错误的实现方法

    本篇文章是对在C语言调试中,锁定错误的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C/C++实现双路快速排序算法原理

    C/C++实现双路快速排序算法原理

    这篇文章主要为大家详细介绍了C/C++实现双路快速排序算法原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 详解C/C++高精度算法的简单实现

    详解C/C++高精度算法的简单实现

    这篇文章主要为大家详细介绍了C/C++中高精度算法(加减乘除)的简单实现,方便以后需要时拷贝使用。感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C++变换迭代器使用方法小结

    C++变换迭代器使用方法小结

    本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 简单掌握C++中的函数模板

    简单掌握C++中的函数模板

    这篇文章主要介绍了C++中的函数模板,包括函数模板的声明和生成以及异常处理等基本知识,需要的朋友可以参考下
    2016-04-04
  • C/C++实现对STORM运行信息查看及控制的方法

    C/C++实现对STORM运行信息查看及控制的方法

    这篇文章主要介绍了C/C++实现对STORM运行信息查看及控制的方法,需要的朋友可以参考下
    2014-07-07

最新评论