C++中数组作为形参的值传递、指针传递和引用传递

一、普通参数值传递、指针传递和引用传递的基本概念

1、值传递:

        在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对形参进行修改,将不会影响到实际参数。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。

2、指针传递:

        实参传给形参的是实参的地址。这样形参访问到的就是实参所在的内存单元,形参的值改变直接带来对应实参的改变。       

3、引用传递:

        形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作

        引用传递中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址。

        下面的代码对此作出细致解释(从实参,形参在内存中存放地址的角度 说明了问题的本质,容易理解 )。

#include <iostream>
#include <vector>

using namespace std;

#include<iostream>
using namespace std;
//值传递
void change1(int n){
    cout<<"\n值传递--函数操作地址"<<&n<<endl;         //显示的是拷贝的地址而不是源地址
    n++;
}

//引用传递
void change2(int & n){
    cout<<"\n引用传递--函数操作地址"<<&n<<endl;
    n++;
}
//指针传递
void change3(int *n){
    cout<<"\n指针传递--函数操作地址 "<<n<<endl;
    *n=*n+1;
}
int main(){
    int n=10;
    cout<<"实参的地址"<<&n<<endl;
	cout<<"n="<<n<<endl;
    change1(n);
    cout<<"after change1() n="<<n<<endl;
    change2(n);
    cout<<"after change2() n="<<n<<endl;
    change3(&n);
    cout<<"after change3() n="<<n<<endl;
	system("pause");
    return 0;
}

参考链接:C++ 值传递、指针传递、引用传递详解 - Geek_Ling - 博客园

结果输出如下:

 二、数组作为形参的值传递、指针传递和引用传递

        数组作为函数参数传递,值传递就是指针地址的传递。所以,函数调用的数组会对本身的数组造成影响,操作形参相当于直接操作实参,这点和普通参数的值传递是不同的。

        参数传递时数组会退化为指针,这就意味着整个数组从来没有传入过函数。因此,在函数声明时,作为函数形参的数组和指针可以互换。即以下两种声明等价:

 void insert(int * arr);
 void insert(int arr[]);

        调用时:

insert(arr);

        以下调用是错误的:

int insert(&arr);

        注意:因为传入数组名时,数组名代表的就是数组的首地址,所以数组名是不可以用“&”符来取别地址的,即当数组作为函数参数进行传递时,不可以使用引用类型进行传递

        另注:数组长度不是参数类型的一部分。函数和编译器都不知道传统给它的数组的长度的大小。——所以我们将数组作为函数参数进行传递时会另外再传入一个数组长度

参考链接:C++关于数组作为函数参数的值传递和指针传递_tao1151208的博客-CSDN博客_c++数组名作为参数传递

猜你喜欢

转载自blog.csdn.net/weixin_50578602/article/details/127487472