C++中函数的数组形参
2017-09-20 23:39
309 查看
函数由函数名以及一组操作数类型唯一的表示。函数的操作数,也即形参(parameter),在一对圆括号中声明,形参与形参之间以逗号分隔。
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}在以上函数中,参数a和b就是swap()函数的形参。当调用该函数时
int i = 1;
int j = 2;
swap(i, j);在以上代码中,i和j是swap()函数的实参。
从图1中可以看出,swap()函数交换的是实参i和j的副本,而不是i和j的本身。
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}则调用swap函数的示意图如图2所示。
从图2中可以看到,swap()函数交换的是实参i和j的本身。
非引用形参”中提到要用实参的副本来初始化形参,所以实参为数组时,不能直接传递给形参。
那么,如果一个函数需要数组作为其参数,这个函数该如何定义呢?
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);
其定义方式为
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);
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}在以上函数中,参数a和b就是swap()函数的形参。当调用该函数时
int i = 1;
int j = 2;
swap(i, j);在以上代码中,i和j是swap()函数的实参。
1 参数传递
每次函数调用时,都会重新创建该函数的所有形参,此时所传递的实参将会初始化对应的形参。1.1 非引用形参
普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会改变实参值。从图1中可以看出,swap()函数交换的是实参i和j的副本,而不是i和j的本身。
1.2 引用形参
引用形参直接关联到其绑定的对象,而并非这些对象的副本。每次调用函数时,引用形参被创建并与相应实参关联。如果将swap()函数的参数修改为引用形参void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}则调用swap函数的示意图如图2所示。
从图2中可以看到,swap()函数交换的是实参i和j的本身。
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/C++中数组名作为函数形参
- c++二维数组以指针数组形式作为形参传进函数
- C++中数组名作为函数的形参和实参
- C++中函数的数组形参
- C++ 函数参数传递-数组形参
- C++ 如何引用结构体数组作为函数形参
- C++函数的数组形参
- C/C++基础知识:数组类型、函数类型到左值和右值的转换
- C++给函数传数组参数
- c++ 函数返回数组
- C++中用指向数组的指针作函数参数
- 数组名在做函数形参时的变化
- 【day0403】C++ 数组形参的传递
- 关于C++中函数能不能返回数组问题
- C/C++中函数参数传之指针形参
- c++函数返回数组
- 总结:数组作为实参的传送及函数中的形参接受
- C++编写二进制字符数组转ASCII码的函数
- 作为函数形参的数组,在函数体内,数组名仅仅是个指针
- 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释