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++指针的引用*&内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 从汇编看c++中引用与指针的使用分析

    首先是引用情形下的c++源码: 复制代码 代码如下: void add(int a, int b, int&c) {    c = a + b;} int main() {    int a = 1;    int b = 2;    int c = 0;    add(a, b, c); } 下面是main对应的汇编码: 复制代码 代码如下: ; 6    : int main() { push    ebp    mov    ebp, esp    sub    esp, 12      

  • c++中引用和指针的区别和联系

    C++中的引用和指针 ★ 相同点: 1. 都是地址的概念:指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名(java中的引用其实也是别名的意思). ★ 区别: 1. 指针是一个实体,而引用仅是个别名:2. 引用使用时无需解引用(*),指针需要解引用:3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" 4. 引用没有 const,指针有 const,const 的指针不可变:5. 引用不能为空,指针可以为空:6. "sizeof 引用&

  • C++中指针和引用的区别分析

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

  • C/C++中指针和引用之相关问题深入研究

    一.基本知识指针和引用的声明方式:声明指针: char* pc;声明引用: char c = 'A'   char& rc = c; 它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对

  • c++ 指针与引用的区别介绍及使用说明

    指针与引用看上去完全不同(指针用操作符"*"和"->",引用使用操作符"."),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量.相反,如果变量肯定指向一

  • 深入理解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

  • 简单谈谈C++中指针与引用的区别

    指针与引用是C++中两个很重要的概念,它们功能看过去很相似,就是都是间接引用某个对象,那么我们应该在什么时候使用指针,什么时候使用引用呢,下面请允许我慢慢道来: 1.永远不要使用一个指向空值的引用.一个引用必须始终指向某个对象,所以当你确定使用一个变量指向某个对象时,但是这个对象在某些时间可能指向控制,这时候你就必须把变量声明为指针类型,而不是引用!当你确定这个变量始终指向某个对象是,这时候你就可以把变量声明为引用类型. char *str=0; //设置指针为空值 char &s=*str;

  • 详解C++中指针和引用的区别

    1.指针和引用的本质(是什么) (1)指针是存放内存地址的一种变量,特殊的地方就在它存放的是内存地址.因此,指针的大小不会像其他变量一样变化,只跟当前平台相关--不同平台内存地址的范围是不一样的,32位平台下,内存最大为4GB,因此只需要32bit就可以存下,所以sizeof(pointer)的大小是4字节.64位平台下,32位就不够用了,要想内存地址能够都一一表示,就需要64bit(但是目前应该没有这么大的内存吧?),因此sizeof(pointer)是8. (2)引用的本质是"变量的别名&q

  • C++ 中引用与指针的区别实例详解

    C++ 中引用与指针的区别实例详解 引用是从C++才引入的,在C中不存在.为了搞清楚引用的概念,得先搞明白变量的定义及引用与变量的区别,变量的要素一共有两个:名称与空间. 引用不是变量,它仅仅是变量的别名,没有自己独立的空间,它只符合变量的"名称"这个要素,而"空间"这个要素并不满足.换句话说,引用需要与它所引用的变量共享同一个内存空间,对引用所做的改变实际上是对所引用的变量做出修改.并且引用在定义的时候就必须被初始化.     参数传递的类型及相关要点: 1 按值

  • 详谈C++引用&和指针在作为形参时的区别

    int n; int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,对n来说是一样的. 对于引用,有以下三条规则: (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化). (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL). (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象). 假如在一个函数中

随机推荐