重温《C++ Primer》笔记十 当数组作为函数参数时
来源:互联网 发布:ecko unltd淘宝旗舰店 编辑:程序博客网 时间:2024/05/22 01:41
提到数组作为实参,大家可能都会想到,数组是不能复制的,所以作为参数时不能真正得到实参数组。另外,使用数组名字的时
候,编译器会自动将其视为指针,因此它实际获得的是实参数组中首个元素的地址。没错,对于非引用数组参数是这样,但是对于
引用数组参数则是可以实现真正的数组传递的。
一、非引用数组形参,[]和长度值的作用
当以数组形式作为函数参数时,首先,[]的作用是告诉编译器这是个指针类型。如下两种形式是不同的:
void func(int array); //参数类型为intvoid func(int array[]); //参数类型为int*
void func(int *);void func(int []);void func(int [10]);
长度值没有任何意义,并且容易混淆,我们在函数中使用长度值来总是不安全的。
小结:当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数
组的长度。
二、使用引用数组形参,实现真正的数组传递
非引用数组作为参数时会被编译器看成是指针类型,但是引用数组类型的形参确实真正的数组类型。这个时候,长度值就是有意义
的了。声明如下:
void func(int (&array)[10]);
int i = 0; int j[5] =0;int k[10] = 0;
在这种中情况下,在函数中我们可以任意地使用长度值了。
需要注意的地方是,&和数组名需要括号,因为下标操作[]的优先级比较高。
三、使用非引用数组参数的形式的几种规范
我们发现,数组形参被认为是指针类型还是真正的数组类型,似乎都无所谓,因为指针类型同样支持下标操作。我们唯一需要考虑
的就是下标越界问题。因为C++编译器并不帮助我们进行下标越界检查,因此这件事情需要我们自己去好好把握;这里有几种方法来避免下标越界:
1、在数组里面防止哨兵
就像C风格的字符串一样,总是以'\0'结尾。与此类似,我们可以在数组的末尾存放一个规定的特殊元素值作为哨兵;
2、以数组首尾位置作为实参
在STL中,容器总是有一个begin和end操作来获取首地址和尾部下一个位置地址。与此类似,我们可以传递数组的首位地址或者首
位下标。
3、直接告知数组大小
在传递数组实参时,因为长度没有任何意义,因此我们可以再添加一个参数用来传递数组的长度。
0 0
- 重温《C++ Primer》笔记十 当数组作为函数参数时
- C/C++学习笔记12:数组作为函数参数
- 当数组作为函数参数时函数中sizeof()的讨论
- C/C++ 二维数组作为函数参数
- 二维数组作为函数参数(C语言)
- C语言数组作为函数参数
- C语言数组作为函数参数
- C语言数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- 数组作为函数参数
- python __new__()和__init__()哪个更早?
- 你真的会二分查找吗?
- 图结构练习——最短路径 floyd算法 SDUT2143
- hdoj-1425-sort【哈希】
- 导航视图控制器(总结)
- 重温《C++ Primer》笔记十 当数组作为函数参数时
- Emacs学习
- NOIP 2013提高组 truck
- Java笔试面试题002
- easyUI的iframe子页面操作父页面元素
- 求一个字符串中出现相同且长度最长的字符串
- java设计模式(3) - 观察者模式(Observer)
- 特殊数组处理
- Fragment的简单使用