C++学习笔记-函数数组传参

问题描述:

    int size_n;
    int a[]={1,3,0,5,-1,6};
    size_n=sizeof(a)/sizeof(a[0]);

定义一个函数void solve(int *a,int size_n);此时需要注意的是数组a的传递方式,对比下引用和指针的方式。

1、函数调用如下所示

int size_n;
int a[]={1,3,0,5,-1,6};
size_n=sizeof(a)/sizeof(a[0]);
solve(a,size_n);

函数定义如下所示:

方式1:

void solve(int a[],int size_n);//可以通过

方式2:

void solve(int a[6],int size_n);//可以通过

方式3:

void solve(int *a,int size_n);//可以通过

方式4:

void solve(int &a,int size_n);//无法通过编译。 这里需要的a是一个int,不是int*,也不是int[]更不是int*&。

方式5:

void solve(int (&a)[6],int size_n);//可以通过,必须确定数组长度。

数组形参定义为非引用时:传递的数组实参转换为指针;

数组形参定义为引用时:编译器不会将数组转换为指针,而是传递数组的引用本身。也就是说,数组的长度不可省略,编译器将检查传入函数的实际数组参数的长度和函数的形式参数的长度是否匹配。

想接收任意长度的数组,应当使用模板函数。如下所示:

template<int size_n>  
void fun(int (&a)[size_n],int size_n)  
{  对数组的操作}

函数调用方式一样。

2、数组形参小结

2-1:数组形参

数组形参会被弱化为指针,所以处理数组的函数通常通过指向数组中元素的指针来处理数组。

void printValues(int *) { /* … */ }
void printValues(int []) { /* … */ }
void printValues(int [10]) { /* … */ }

上面3种定义等价,形参类型都是int *,通常使用第1种,即上述例子中的方式3。第2种形式虽然看起来更直观,但容易引起误解,因为函数操纵的毕竟不是数组本身,而是指向数组元素的指针。第3种形式的数组长度是被忽略的,这里的10并无实际的约束作用,在printValues内部不应依赖这个数组长度做事情。所以,这个数字并不重要。  和其他类型一样,形参也可以是数组的引用。这时编译器不会将数组实参转换为指针,而是传递数组的引用本身。数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配。

#include <iostream>
using namespace std;
void printValues(int (&arr)[10]) 
{ 
	for (size_t i = 0; i != 10; ++i)
		cout << arr[i] << endl;
}

int main()
{
	int i = 0, j[2] = {0, 1};
	int k[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

	printValues(&i); // error: argument is not an array of 10 ints
	printValues(j); // error: argument is not an array of 10 ints
	printValues(k); // ok: argument is an array of 10 ints

	return 0;

}
错误如下所示:

这个版本的printValues只严格接受含有10个ints的数组,所以在printValues函数体内依赖数组大小也是安全的。&arr两边的括号是必须的,否则int &arr[10],会被当做是含有10个引用的数组。

2-2:非形参的数组引用。

至于数组引用的使用,可以参见下面程序。

int main()
{
	int i = 0, j[2] = {0, 1};
	int k[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int (&b)[10]=k;

	printValues(b); //
	printValues(k); // ok: argument is an array of 10 ints

	return 0;
}
而不能写成如下的

int k[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int &b=k;

程序会直接报错!无法从“int [10]”转换为“int &”。可以与函数调用时引用数组作为形参进行对比。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值