• 引用类型

    • 引用是一个 别名,它使得你可以通过一个新的名字来 访问已经存在的变量
  • 指针类型

    • 指针是一个 变量存储另一个变量的内存地址

说得挺玄乎的,让我们以c为例子,然后再过渡到c++

下面这一段程序很简单,就是把一个变量传给一个函数,然后函数更新这个值

聪明的你肯定发现了问题所在,那就是我们用的是 值传递,也就是说 函数参数是实际参数的副本,所以在函数内的修改不会同步到 实际参数

#include <stdio.h>

void update(int x)
{
    x = 999;
}

int main(void)
{
    int a = 1;
    update(a);
    printf("a = %d\n", a);

    return 0;
}

1

那么,我们很快就想到了解决办法,那就是用 指针,来实现 引用传递,让我们能够修改 实际参数 (注意,在 c 中是没有 引用传递 这一说的,只有 值传递,传入指针实际上得到的也是 指针的副本,不过我们可以通过指针来间接修改

#include <stdio.h>

void update(int *x)
{
    *x = 999;
}

int main(void)
{
    int a = 1;
    update(&a);
    printf("a = %d\n", a);

    return 0;
}

1

非常好,我们成功的修改了 函数外部变量 的值

好,在有了上面的基础后,我们再过渡到c++

#include <iostream>

void update(int x)
{
    x = 999;
}

int main(void)
{
    int a = 1;
    update(a);
    std::cout << "(cpp) a = " << a << std::endl;

    return 0;
}

1

上面的函数你肯定知道失败的原因了,我就不多提了,然后用指针的办法也不多说了,和c是一样的

接下来我们看看真正的 引用

#include <iostream>

void update(int &x)
{
    x = 999;
}

int main(void)
{
    int a = 1;
    update(a);
    std::cout << "(cpp) a = " << a << std::endl;

    return 0;
}

注意到了吗,我们的 void update(int &x),我们加上了一个 &,这就是引用传递了

但我们传入参数是,会发生什么呢 ===> int &x = a;,这就创建了一个别名,就相当于告诉编译器,嘿,x和a是同一个东西,不要在拷贝了,既然是同一个东西,那么对 x 的修改自然能够反应在 a 上了

值得一提的是,别名并不会占用额外的空间,他本质上是为了让语法更加简洁可读,因为让代码更好看而浪费空间什么的也太不c++高性能了(:->)

最后提一句,void update(int *&p) 这是合法的,这个意思是 p是你传入的指针的别名,所以对p的修改能够反应到实际参数,在c中的话,我们就得用 二级指针了 void update(int **p)

看到这里是不是对 引用 理解更深了呢

 posted on 2025-06-05 11:14  Dylaris  阅读(24)  评论(0)    收藏  举报