C++中函数的数组形参

原创 2017年09月20日 23:39:26

函数由函数名以及一组操作数类型唯一的表示。函数的操作数,也即形参(parameter),在一对圆括号中声明,形参与形参之间以逗号分隔。

void swap(int a, int b)
{
   int temp = a;
   a = b;
   b = temp;
}
在以上函数中,参数ab就是swap()函数的形参。当调用该函数时

int i = 1;
int j = 2;
swap(i, j);
在以上代码中,ijswap()函数的实参。

1 参数传递

每次函数调用时,都会重新创建该函数的所有形参,此时所传递的实参将会初始化对应的形参。

1.1 非引用形参

普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会改变实参值。

从图1中可以看出,swap()函数交换的是实参ij的副本,而不是ij的本身。

1.2 引用形参

引用形参直接关联到其绑定的对象,而并非这些对象的副本。每次调用函数时,引用形参被创建并与相应实参关联。如果将swap()函数的参数修改为引用形参

void swap(int& a, int& b)
{
   int temp = a;
   a = b;
   b = temp;
}
则调用swap函数的示意图如图2所示。

从图2中可以看到,swap()函数交换的是实参ij的本身。

2 数组形参

当要使用数组作为函数形参时,因为一个数组不能使用另外一个数组初始化,也不能将一个数组赋值给另外一个数组,而在1.1 非引用形参”中提到要用实参的副本来初始化形参,所以实参为数组时,不能直接传递给形参。

那么,如果一个函数需要数组作为其参数,这个函数该如何定义呢?

2.1 参数为数组的函数

例如一个函数的作用是找出数组中的最大数,数组为该函数的参数,则可以用如下三种方式定义该函数:

int FindMax(int* array);
int FindMax(int array[]);
int FindMax(int array[10]);
虽然不能直接传递数组,但是函数的形参可以写成数组的形式。此时,调用该函数是的实参数组被编译器自动转换为指针,也就是说,以上三种定义是等价的,其参数类型都是int*

调用该函数时,直接将数组名称作为实参即可。

int array_my[5] = {1, 2, 3, 4, 5};
int array_maxvalue = FindMax(array_my);

2.2 参数为数组引用的函数

如果函数的形参时数组的引用,则编译器不会把数组实参转换为指针,而是传递数组的引用本身。

其定义方式为

int FindMax(int(&array)[5]);
调用该函数的方法与2.1 参数为数组的函数”中的方法相同。

需要注意的时,调用参数为数组引用的函数时,编译器检查实参的大小与形参的大小是否匹配。

int FindMax(int(&array)[5]);
时,调用该函数的形参必须是有5个元素的整形数组的数组名,以下调用方式是错误的。

int array_my[3] = {1, 2, 3};
int array_maxvalue = FindMax(array_my);
而对于参数为数组的函数

int FindMax(int array[10]);
则没有要求形参和实参的数组元素个数必须对应,以下方式调用则是正确的。

int array_my[3] = {1, 2, 3};
int array_maxvalue = FindMax(array_my);



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++必知必会之(6)数组形参

1、C++中根本不存在所谓的“数组形参”,因为在数组传入时,实质上只传入指向其首元素的指针。 void average( int ary[12] );   //形参ary是一个int * //.......

C++多维数组形参

需求今天在学习数据结构和算法时遇到一个需要传递多维数组形参的问题。问题本身很简单,向方法传递一个二维数组,但是使用的时候为了能够让数组维度值能够动态可变(比如向同一个方法传递3X3矩阵或者4X4矩阵)...

C++中的数组形参

楔子    去年,周星星大哥曾经在VCKBASE/C++论坛发表过一篇文章“数组引用"以避免"数组降阶”,当时我不能深入理解这种用法的含义;时隔一年,我的知识有几经锤炼,终于对此文章渐有所悟,所以把...

【day0403】C++ 数组形参的传递

# 数组是C/C++重要的一个知识点,C++的字符串又不同于c的字符数组(C风格字符串) 今天写点代码试试函数参数传递--数组形参 * 三种传递数组的写法 * 数组实参:数组名--指向数组首地址的...

C++ primer 八 数组形参

数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响,这两个性质分别 是:不允许拷贝数组以及使用数组时(通常)会将其转换成 指针。因为不能拷贝数组,所以我们无法以值传递的方式使用 数组参数。因为...

7.2.4 数组形参

数组有两个特殊的性质:1.数组不能复制2.数组名为第一个指向第一个元素的指针。因此,在处理数组函数时,通常通过操纵指向数组的元素的指针。 1.数组形参的定义 void print_1(int*...

数组形参

如何使用数组参数 如果一个函数以一维数组为参数,我们可以这样声明这个函数 void func(int* a) ; void func(int a[]) ; void func(int a[...

【C语言】数组形参

数组形参

数组形参

http://blog.163.com/mageng11@126/blog/static/1408083742011424135666/ 附上链接内容: 在 C++中,数组永远不会按值传递,它是传...

指针、动态数组、二维数组、数组形参学习小记

C++中指针和数组的学习,包括指针中常见问题,以及一维数组二维数组通过数组形参来进行函数传参,动态数组等问题
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)