C++参数的传递方式

C++参数的传递方式

————————————————————————供记忆学习和理解

1. 值传递

· 调用时,将实参的值传递给对应的形参。由于形参有自己独立的存储空间,又作为函数的局部变量,故在函数中对任何形参值的修改,都不会改变实参变量的值。
· 典型的例子如下:

#include <iostream>
using namespace std;
void swap(int,int);
int main()
{
    int a = 1;
    int b = 2;
    cout << "交换前 a = " << a << "\tb = "<< b << endl;
    swap(a,b);
    cout << "交换后 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int x, int y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
    cout << "交换函数swap内部 a = " << x <<"\tb = "<< y << endl;
}
//结果
交换前 a = 1    b = 2
交换函数swap内部 a = 2  b = 1
交换后 a = 1    b = 2

由上可知,主函数内全局变量的a,b在执行函数swap调用后a和b值都没有改变,只是在函数内部作了交换。
分析函数调用的过程:
(a)调用前,a、b有自己的存储空间和初始值;
(b)调用时,为形参x、y分配了存储空间,并将实参a、b的值一一对应过来,在函数执行过程中将x、y的值互换;
(c)调用结束后,x、y的存储空间被释放,a、b的值没有影响

2. 引用传递

· 引用是一种特殊的变量,可认为是一个变量的别名。
· 定义引用变量的语法如下:

数据类型 & 引用名 = 变量名;

· 引用变量并不分配独立的存储空间,与所对应的变量共用同一个内存空间;定义时如果该引用变量不是作为函数的参数或返回值时,必须初始化,即提供所要引用的变量名。
· 以上例进行对比举例如下:

#include <iostream>
using namespace std;
void swap(int&,int&);
int main()
{
    int a = 1;
    int b = 2;
    cout << "交换前 a = " << a << "\tb = "<< b << endl;
    swap(a,b);
    cout << "交换后 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int& x, int& y) // 函数参数列表中定义了两个引用变量x、y 
{
    int temp;
    temp = x;
    x = y;
    y = temp;
    cout << "交换函数swap内部 a = " << x <<"\tb = "<< y << endl;
}
//结果如下
交换前 a = 1    b = 2
交换函数swap内部 a = 2  b = 1
交换后 a = 2    b = 1

结果说明在函数swap调用过后,实参的值被改变。由此推断,在函数调用时,作为形参的引用变量并不分配新的存储空间,它将作为实参变量的别名和实参共用同一个内存空间,提高了运行效率。

故此,使用引用参数可以直接操作实参变量从而实现通过修改形参值而达到修改对应实参的目的。

3. 指针变量传递

采用指针变量作为函数的参数进行传递,所传递的是对应的地址。
3.1 形参变化影响实参的情况

#include <iostream>
using namespace std;
void swap(int* x,int* y);
int main()
{
    int a = 1, b = 2;
    int *p1 = &a, *p2 = &b;  //定义两个指针变量,分别指向a、b,由于a、b中的值为int,故指针变量也为int. & 为取变量地址的操作符
    cout << "交换前 a = " << a << "\tb = "<< b << endl;
    swap(p1,p2);
    cout << "交换后 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int* x, int* y) // 函数参数列表中定义了两个指针变量x、y 
{
    int temp;
    temp = *x; // 取指针变量x的值(地址)所对应的变量的值,并赋值给temp
    *x = *y;
    *y = temp;
    cout << "交换函数swap内部 a = " << *x <<"\tb = "<< *y << endl;
}
//结果
交换前 a = 1    b = 2
交换函数swap内部 a = 2  b = 1
交换后 a = 2    b = 1

可见,函数调用时,p1、p2作为指向a、b的指针传递给对应的函数形参,在函数内部通过* 得到指针变量的地址所对应的值并进行交换,从而改变了实参的值。

3.2 形参变化不影响实参的情况

#include <iostream>
using namespace std;
void swap(int* x,int* y);
int main()
{
    int a = 1, b = 2;
    int *p1 = &a, *p2 = &b;  //定义两个指针变量,分别指向a、b,由于a、b中的值为int,故指针变量也为int. & 为取变量地址的操作符
    cout << "交换前 a = " << a << "\tb = "<< b << endl;
    swap(p1,p2);
    cout << "交换后 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int* x, int* y) // 函数参数列表中定义了两个指针变量x、y 
{
    int *temp; // 定义了一个指针变量
    temp = x; // 以下是对地址进行了交换
    x = y;
    y = temp;
    cout << "交换函数swap内部 a = " << *x <<"\tb = "<< *y << endl;
}
交换前 a = 1a的地址:000000633B0FF7A4   b = 2b的地址:000000633B0FF7C4
交换函数swap内部 a = 2  b = 1
交换后 a = 1a的地址:000000633B0FF7A4   b = 2b的地址:000000633B0FF7C4

结果可见,函数调用后a、b的值并未改变,包括地址值。在函数调用时,在函数内部首先为a、b的地址,即为x、y开辟了新的存储空间,并作了交换,于是函数内部a、b的值发生了互换。在函数调用后,x、y的存储空间被释放,但并不影响a、b的值

转自C、C++的几种参数传递方式(看完即懂)
C++中值传递和引用传递的区别

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页