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++中数组名作为函数的形参和实参

11
  • u011699703
  • u011699703
  • 2014年05月26日 15:03
  • 1910

C/C++中数组名作为函数形参

在C或者C++中求一个数组的大小的方法为sizeof(数组名)  /  sizeof(数组的第一个元素),对于int array[ ] = {1, 2, 3, 4, 5};数组的大小也就为sizeof...
  • chienchia
  • chienchia
  • 2014年05月26日 15:34
  • 4661

详谈C++中数组作为函数参数

一、一个例子引发的思考  运行以下代码,请问输出是什么?例子来源于《剑指Offer》,我对书上例子做了修改,让其可以运行。#include using namespace std;int GetSiz...
  • oNever_say_love
  • oNever_say_love
  • 2015年10月26日 12:33
  • 2488

c语言中,二维数组作为形参在函数之间的传递

以前经常在函数中传递一维数组或指针。今天,由于工作需要,需要将一个二维数组通过函数来进行传入,原本以为在函数接口处定义一个指向指针的指针就可以了,但是,在编译过程中发现怎么也编译不通过。经过调整,得出...
  • weixin_36989023
  • weixin_36989023
  • 2017年03月28日 19:02
  • 706

C中数组在函数中形参和实参的区别

#include #include #include void printArray(int a[],int num){ int i; for(i=0;i
  • LHN_hpu
  • LHN_hpu
  • 2016年05月26日 17:52
  • 1064

C++引用&和指针在作为形参时的区别

int n; int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任...
  • ljb825802164
  • ljb825802164
  • 2016年01月19日 10:25
  • 4565

C++引用调用、内联函数、带默认形参值的函数

今天在看鸡啄米的C++系列教程的时候学到了三个有趣的东西:引用调用、内联函数和带默认形参值的函数。 首先是引用调用: 引用调用据百度百科说是C++特有的概念。C++函数调用有三种方式:值调用、引用...
  • hola_f
  • hola_f
  • 2016年07月05日 15:55
  • 790

C++函数中const形参与非const形参

关于C++函数中形参、实参const问题,比较绕,在此特意总结归纳一下: 先看一个例子: void swap1( int *x, int *y){ int temp=*x; *x=*y; ...
  • ziyanguang1989
  • ziyanguang1989
  • 2013年11月14日 17:09
  • 1111

[C++] 将成员函数作为函数形参

函数以及函数对象都可以作为参数来增加其它函数的功能,并且通常作为STL算法的第二个版本的最后一个参数。成员函数是否可以作为形参呢?如果可以,形参表如何写呢?...
  • ILOVEYOUXIAOWANGZI
  • ILOVEYOUXIAOWANGZI
  • 2014年02月21日 11:29
  • 3075

C++函数中const形参与非const形参

在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢? 先来看一个简单的例子: #include #incl...
  • zz460833359
  • zz460833359
  • 2015年09月11日 21:50
  • 2739
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中函数的数组形参
举报原因:
原因补充:

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