参数传递(值传递,引用传递)

值传递

  • 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
  • 在函数结束返回后,形参被丢弃释放,实参的内容不会被改变

数据值传递和地址值传递

  • 数据值传递

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //C语言的数据值传递
    #include<stdio.h>

    int fun(int a)
    {
    a = 3; //对a进行改变
    printf("fun's a is:%d\n",a);
    return 1;
    }

    int main()
    {
    int a = 1;
    printf("main's original a is:%d\n",a);
    fun(a); //调用fun(int )
    printf("main's a is:%d",a);
    return 0;
    }

    picture

  • 地址值传递

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //C语言的地址值传递(实例一)
    #include<stdio.h>

    int fun(int* p)
    {
    *p = 3; //对p指向的数据(main's a)进行了改变
    return 1;
    }

    int main()
    {
    int a = 1;
    int* p = &a; //初始化指针并指向a
    printf("main's original a is:%d\n",a);
    fun(p); //调用fun(int* )
    printf("main's a is:%d",a);
    return 0;
    }

    picture

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //C语言的地址值传递(更揭示值传递实质)(实例二)
    #include<stdio.h>

    int fun(int* p)
    {
    p++; //对传过来的地址值进行更改
    printf("fun's p is:%d\n",p);
    return 1;
    }

    int main()
    {
    int a = 1;
    int* p = &a; //初始化指针并指向a
    printf("main's original p is:%d\n",p);
    fun(p); //调用fun(int* )
    printf("main's p is:%d",p);
    return 0;
    }

    picture

    地址值传递总结:

    1. 第一个实例常用;第二个不常用,但更加揭示值传递的实质。

    2. 通过地址值传递可以实现被调用的函数中的数据变更影响到全局(实例一),不同函数可以共同维护和使用同一内存块儿的数据。

    3. 地址值传递实质是值传递,不同于数据值传递的是地址值复制到被调用的函数中后通常不加改变和参与运算,而是直接取用其指向的数据,来修改和运算。(取用方式:*p)

引用传递

在C++中,函数参数的传递方式有引用传递。所谓引用传递是指在调用函数时自动将实际参数的地址传递到函数中,并作为局部变量在堆栈中开辟内存空间,被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。那么在函数中对参数所进行的修改,将影响到实际参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//C++引用传递
#include<iostream>

using namespace std;

int fun(int& b)//参数定义为一个整型引用
{
b = 88; //修改形参b的值
cout << "fun's b is:" << b << endl;
}

int main()
{
int a = 1;
cout << "main's original a is:" << a << endl;
fun(a); //调用fun(int& )
cout << "main's a is:" << a << endl;
return 0;
}

picture

辨析

  • 值传递是直接传递实际参数的值到形参,相当于copy, 实参和形参分别占用不同的相同大小的存储单元,对形参的操作并不影响实参
  • 引用传递是传递实际参数的地址值到形参,形参作为局部变量在堆栈中开辟了内存空间,接收实参的地址值存放,被调函数对形参的所有操作都被处理为间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量,此时对形参的所有操作即是对实参的操作

本文借鉴/推荐参考

值传递 引用传递(传地址,传引用)的区别 ——无限


参数传递(值传递,引用传递)
https://blog.wangxk.cc/2019/08/04/参数传递(值传递,引用传递)/
作者
Mike
发布于
2019年8月4日
许可协议