文章

指针–引用与指针

1.引用的含义

引用是C++中一个强有力的语法,在编程极为实用。众所周知,函数的参数是作为局部变量的,对局部变量的操作不会影响外部的变量,如果想要修改传入的参数,那么只能用指针。那么,有没有什么办法可以不使用指针,也可以达到修改传入参数的目的?一个很简便的方法使用C++中的“引用”。引用不产生副本,而是给原变量起了个别名。例如,假如我本名叫做“酷飞”,某天大家给我起了个别名“维尼熊”,其实这两个名字说的都是同一个人(即这两个名字都指向了同一个人)。引用就相当于给原来的变量又取了个别名,这样旧名字和新名字实际上都是指向同一个人,引用就相当于给原来的变量又取了个别名,这样旧名字就和新名字实际上都是指向同一个东西,且对于引用变量的操作就是对原变量的操作。

引用的使用方法很简单,只需要在函数的参数类型后面加一个&就可以(&加在int后或者变量名字前都可以,考虑到引用是别名的意思,因此一般都是写在变量名前面),例如(由于是C++的语法,因此文件必须保存为.cpp类型):

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void change(int &x)
{
    x = 1;
}
int main()
{
    int x = 10;
    change(x);
    printf("%d\n", x);
    return 0;
}

输出结果:

```plain text 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在上述代码中,在change函数的参数int x中加入了&,在传入参数时对参数的修改就会对原变量进行修改。需要注意的是,不管是否使用引用,**函数的参数名和实际传入的参数名可以不同。**例如上面的这个程序改成下面这样也是可以的:

```cpp
#include <stdio.h>

void change(int &x)
{
    x = 1;
}
int main()
{
    int a = 10;
    change(a);
    printf("%d\n", a);
    return 0;
}

输出结果

```plain text 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
注意:要把引用的&跟取地址符&区分开来,引用并不是取地址的意思。

2.指针的应用

在之前[指针—使用指针变量作为函数参数](https://zhuanlan.zhihu.com/p/51419476)的文末错误写法二中,试图将传入的地址交换来达到交换两个变量的效果,但失败了。这是因为对指针变量本身的修改无法作用到原指针变量上。此处可以通过引用来完成上面希望的效果:

```cpp
#include <stdio.h>

void swap(int *&p1, int *&p2)
{
    int *temp = p1;
    p1 = p2;
    p2 = temp;
}
int main()
{
    int a = 1, b = 2;
    int *p1 = &a, *p2 = &b;
    swap(p1, p2);
    printf("a = %d, b = %d\n", *p1, *p2);
    return 0;
}

输出

plain text a=2,b=1

这里的原因是什么?之前说过,指针变量实际上是unsigned类型的整数,因此为了理解上的方便,可以简单吧int*型理解为unsigned int型变量,而直接交换这样的两个整形变量是需要加引用的。

需要强调的是,由于引用是产生变量别名,因此常量不可使用引用,于是上面的代码中不可以写成swap(&a, &b),而必须只用指针变量p1与p2存放&a与&b,然后把指针变量作为参数传入。

其实引用作为别名引入后,请阅读代码时碰到引用对其不太理解的时候,不妨先将引用去掉以后看看原来的意义是什么,再加上引用,会容易理解。

本文由作者按照 CC BY 4.0 进行授权