7.参数传递中:值传递、引用传递、指针传递的区别-灵析社区

菜鸟码转

1.参数传递的三种方式:

  • 值传递:形参是实参的拷贝,函数对形参的所有操作不会影响实参。形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入。当函数内部可能需要改变参数具体的内容时,我们则采用形参,在组成原理上来说,对于值传递的方式我们采用直接寻址。
  • 指针传递:本质上是值传递,只不过拷贝的是指针的值,拷贝之后实参和形参是不同的指针,但指向的地址都相同。通过指针可以间接的访问指针所指向的对象,从而可以修改它所指对象的值。在组成原理上来说,对于指针传递的方式一般采用间接寻址。
  • 引用传递:当形参是引用类型时,我们说它对应的实参被引用传递。当然不同的编译器对于引用有不同的实现,部分编译器在底层也是使用指针来实现引用传递。

C++

#include <iostream>
using namespace std;

void fun1(int tmp){ // 值传递
    cout << &tmp << endl;
}

void fun2(int * tmp){ // 指针传递
    cout << tmp << endl;
}

void fun3(int &tmp){ // 引用传递
    cout << &tmp << endl;
}

int main()
{
    int var = 5;
    cout << "var 在主函数中的地址:" << &var << endl;

    cout << "var 值传递时的地址:";
    fun1(var);

    cout << "var 指针传递时的地址:";
    fun2(&var);

    cout << "var 引用传递时的地址:";
    fun3(var);
    return 0;
}

/*
运行结果:
var 在主函数中的地址:0x23fe4c
var 值传递时的地址:0x23fe20
var 指针传递时的地址:0x23fe4c
var 引用传递时的地址:0x23fe4c
*/

说明:从上述代码的运行结果可以看出,只有在值传递时,形参和实参的地址不一样,在函数体内操作的不是变量本身。引用传递和指针传递,在函数体内操作的是变量本身。

我们知道函数调用的方式,大部分的编译器按照函数形参定义的逆序,依次将参数压入栈内,上述提到参数的形式,如果是值传递,则压入栈中的是一个临时变量,该变量与传入的值内容相同;如果是指针传递或者引用传递,则压入栈的可能是一个临时的指针变量,该指针指向与传入的指针指向的内容相同。从函数调用机制来开,不管何种调用所有实参的传入时都在栈中开辟了空间。

阅读量:1256

点赞量:0

收藏量:0