0%

C++通过引用传递数组给函数

C++向函数中传递数组作为参数,有如下几种方式,其中传递指针的方式结果是一样的,每种方式都会告诉编译器将要接收一个整型指针。

方式 1形式参数是一个指针

1
void function(int *param){};

方式 2形式参数是一个已定义大小的数组

1
void function(int param[10]){};

方式 3形式参数是一个未定义大小的数组

1
void function(int param[]){};

以上三种方式C++ 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。数组有二个特性,影响作用在数组上的函数:一是不能复制数组,二是使用数组名时, 数组名会自动指向其第一个元素的指针。因为不能复制,所以无法编写使用数组类型的形参,数组会自动转化为指针。

在向函数输入参数的时候, 值传递(pass by value)和指针传递(pass by pointer),需要给形参分配存储单元、当传递是对象时,要调用拷贝构造函数。而且指针最后析构时,要处理内存释放问题。而使用 引用传递(pass by reference),则调用函数在内存中不会产生形参。

在C++中,数组可以按引用传递。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名, 数组形参声明为数组的引用,编译器会传递数组的引用本身

1
2
3
4
5
6
void function(int &param[size]){
for (int i = 0; i < size; i++)
{
cout << param[i] << endl;
}
};

使用模板扩展

1
2
3
4
5
6
7
template<typename T,int N>
void function(T &params[N]){
for (int i = 0; i < N; i++)
{
cout << params[i] << endl;
}
};

c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector):

1
2
3
function1(std::vector<std::vector<int> > vec); //传值
function2(std::vector<std::vector<int> >& vec); //传引用
function3(std::vector<std::vector<int> >* vec); //传指针

三种方式对应的调用形式分别为:

1
2
3
function1(vec); //传入值
function2(vec); //传入引用
function3(&vec); //传入地址

三种方式的效果分别为

1
2
3
会发生拷贝构造
不会发生拷贝构造
不会发生拷贝构造