代码改变世界

函数的传值与传址

2019-09-15 12:13  艾伦爱尔敏  阅读(597)  评论(0编辑  收藏  举报

  在c++中函数参数的传递分为三种:传值、传址以及传引用,本帖主要介绍传值与传址的区别。

函数的传值

  首先讨论函数的传值,顾名思义函数的传值仅仅是把实参的值传递给了形参的值,这也就是说实参与形参之间互不影响,仅仅因为函数的需要其值相同而已。在这里我们把它形象地想象成数学中一个函数f(x),而现在我们要求f(a),当我们运算完成后,a的值还是它原来的那个数,而我们的f(x)函数仍然可以继续做f(b)、f(c)等一系列运算,这里就可以将这种特质类推到c++语言中的函数利用函数过后会将其形参值释放掉的模式,我认为函数的设计初衷也是如此。

以上内容间接说明了函数传值并不能改变实参的值,下面我们用一个最常见的例子来说明此特质:

#include<iostream>
using namespace std;
void swap(int a, int b)
{
    int x;
    x = a;
    a = b;
    b = x;
    cout << a << " " << b << endl;
}
int main()
{
    int a = 1, b = 2;
    swap(a, b);
    cout << a << " " << b << endl;
    return 0;
}

运行结果为:2 1

                      1 2

  由此可看出交换函数swap并没有改变主函数中a与b的值。

函数的传址

  由以上的例子表明,函数并不能做到更改主函数的值,所以人们就想到了利用地址来间接更改地址中的值,也就是所谓的函数的传址。

  函数的传址就是主函数中的实参是一个地址变量,而相对应的被调用函数的形参也是一个地址变量(也就是指针变量)。这个变量中存着地址,可以在被调函数中对其所指向的地址中的数值进行更改,而如介绍传值时所说的调用结束后会释放形参,而传址的方式使得函数释放的不是指针指向的值而是指针本身。所以c++通过这种函数传递方式来完成对主函数中的值的改变。

  下面用例子更加直观地描述:

#include<iostream>
using namespace std;
void swap(int *a, int *b)
{
    int x;
    x = *a;
    *a = *b;
    *b = x;
    cout << *a << " " << *b << endl;
}
int main()
{
    int *a, *b, c = 1, d = 2;
    a = &c;
    b = &d;
    swap(a, b);
    cout << *a << " " << *b << endl;
    return 0;
}

注意:在c++中,如果想在函数中更改某个指针的值,参数是指针是做不到更改其值的,应使用指针的指针来进行更改。因为参数传递的本质仍然是传值。