浅谈C++值传递、地址传递、引用传递

浅谈C++值传递、地址传递、引用传递

  • 共同的困惑
  • 函数
    • 形式参数和实体参数
    • 值传递(数组作为参数时除外)
    • 地址传递
    • 引用传递

作者:Gl_Zhang96
来源:CSDN
版权声明:本文为博主原创文章,转载请附上博文链接!

共同的困惑

相信大家在入门学习C++的时候都会有这样一个疑惑,在对函数调用的时候,函数内部的操作究竟会不会引起主函数变量值的改变。对于这个问题,简单谈论一下我自己的理解。理解不深,如有错误欢迎大家指正。

函数

我理解的函数实际是一个功能的集合。类似数学中的函数,给定一个输入 x x x ,就会得到一个输出 y y y。C++的程序也是一样,给定一些参数,通过调用函数,得到一些返回值或者实现某些功能。

形式参数和实体参数

首先介绍一下函数的形式参数(以下简称形参)和实体参数(以下简称实参)。
话不多说,先来一段代码:

#include 
using namespace std;

void change(int c, int d)
{
    c = 3;
    d = 5;
}

int main()
{
    int a = 1;
    int b = 1;
    change(a, b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    return 0;
}

在以上代码中,除主函数以外,定义了一个change函数,函数带有参数(int c, int d),这两个就称为形参,通过这两个参数在函数内部的运算来标明函数的实现内容。在主函数(main)中,我们调用了函数change(),传入的两个参数(int a, int b)就是实参了。那么函数的实参是如何传递值给形参的呢?

值传递(数组作为参数时除外)

我们来运行上方的代码,得到如下的结果:
在这里插入图片描述
很显然,change()函数并没有改变主函数中a和b的值。这种由实参到形参传递参数值的过程就称为值传递了。
讲到这里可能还是有点晦涩难懂,通俗的来讲,值传递相当于将原来的参数复印了一份交给函数,无论函数对复印件如何处理,都不会对原件产生任何的影响。而当函数执行结束后,就会将形参释放,也就是将复印件销毁了。
下面用一个简单的图来表示这个过程:
浅谈C++值传递、地址传递、引用传递_第1张图片
对于main函数而言,系统开辟一块内存空间,其中存放变量a和b,值都为1。然后调用函数change(),系统重新开辟一块存储空间,并将a和b的值拷贝一份给c和d(这里注意,形参可能与实参同名,例如这里的形参也可以是a和b,但二者不是一个东西,因为根本不在一块存储空间内),此时c和d的值变为1,进而通过函数的操作将c和d的值修改为3和5,函数调用结束,change区域变量释放。显然main中a和b的值并未发生任何改变。

地址传递

那如果想通过函数来修改变量的值该怎么做呢,一种方法就是通过地址传递,请看下面的代码:

#include 
using namespace std;
void change(int *c, int *d)
{
   *c = 3;
   *d = 5;
}

int main()
{
   int a = 1;
   int b = 1;
   change(&a, &b);
   cout << "a=" << a << endl;
   cout << "b=" << b << endl;
   return 0;
}

此处change函数的形参变为了整型指针,并且调用change()函数时,传入的参数也是变量a和b的地址,即让指针c和d指向变量a和b。还是用一个图来说明这个问题:
浅谈C++值传递、地址传递、引用传递_第2张图片
同之前一样,当调用函数change()时,系统新开辟一块存储空间用来存放c和d。然而不同的是,此时是将a和b的地址传递给c和d(即c和d中存放的是a和b的地址)。此时相当于c和d指向a和b,可以通过这个指向的箭头来对a和b存放的值做任意改动(这里是赋值成3和5)。所以理所当然得到如下的结果:
在这里插入图片描述
所以,将变量的地址传递出去是一件非常危险的事情哦,因为这样函数就可以通过地址任意修改变量的值了。

引用传递

变量的引用相当于给变量起了一个别名,两者指的其实是一个东西。所以运行下面的代码:

#include 
using namespace std;

void change(int &c, int &d)
{
   c = 3;
   d = 5;
}

int main()
{
   int a = 1;
   int b = 1;
   change(a, b);
   cout << "a=" << a << endl;
   cout << "b=" << b << endl;
   return 0;
}

得到结果:
在这里插入图片描述
既然指的是同一个东西,当然a和b的值也就通过函数改变了。引用传递和地址传递起到了同样的效果,但书写和理解起来都似乎更简单一些

你可能感兴趣的:(C/C++)