您的位置:首页 > 编程语言 > C语言/C++

重温《C++ Primer》笔记十 当数组作为函数参数时

2015-08-06 21:19 435 查看
提到数组作为实参,大家可能都会想到,数组是不能复制的,所以作为参数时不能真正得到实参数组。另外,使用数组名字的时

候,编译器会自动将其视为指针,因此它实际获得的是实参数组中首个元素的地址。没错,对于非引用数组参数是这样,但是对于

引用数组参数则是可以实现真正的数组传递的。

一、非引用数组形参,[]和长度值的作用

当以数组形式作为函数参数时,首先,[]的作用是告诉编译器这是个指针类型。如下两种形式是不同的:

void func(int array);  //参数类型为int
void func(int array[]);  //参数类型为int*


另外,长度值是没有任何意义的,编译器会直接忽视它。因此,下面三种方式是相同的:

void func(int *);
void func(int []);
void func(int [10]);


长度值没有任何意义,并且容易混淆,我们在函数中使用长度值来总是不安全的。
小结:当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数
组的长度。

二、使用引用数组形参,实现真正的数组传递

非引用数组作为参数时会被编译器看成是指针类型,但是引用数组类型的形参确实真正的数组类型。这个时候,长度值就是有意义
的了。声明如下:

void func(int (&array)[10]);


上面的这种函数原型只接收类型为int,长度为10的数组。如下几种情况:

int i = 0;
int j[5] =0;
int k[10] = 0;


在&i、j、k三者中,只有k能够作为参数调用func函数。

在这种中情况下,在函数中我们可以任意地使用长度值了。

需要注意的地方是,&和数组名需要括号,因为下标操作[]的优先级比较高。

三、使用非引用数组参数的形式的几种规范

我们发现,数组形参被认为是指针类型还是真正的数组类型,似乎都无所谓,因为指针类型同样支持下标操作。我们唯一需要考虑
的就是下标越界问题。因为C++编译器并不帮助我们进行下标越界检查,因此这件事情需要我们自己去好好把握;这里有几种方法来避免下标越界:

1、在数组里面防止哨兵

就像C风格的字符串一样,总是以'\0'结尾。与此类似,我们可以在数组的末尾存放一个规定的特殊元素值作为哨兵;

2、以数组首尾位置作为实参

在STL中,容器总是有一个begin和end操作来获取首地址和尾部下一个位置地址。与此类似,我们可以传递数组的首位地址或者首
位下标。

3、直接告知数组大小

在传递数组实参时,因为长度没有任何意义,因此我们可以再添加一个参数用来传递数组的长度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: