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 | void function(int ¶m[size]){ |
使用模板扩展
1 | template<typename T,int N> |
c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector):
1 | function1(std::vector<std::vector<int> > vec); //传值 |
三种方式对应的调用形式分别为:
1 | function1(vec); //传入值 |
三种方式的效果分别为
1 | 会发生拷贝构造 |