https://blog.csdn.net/thecoldone/article/details/50759044编程
C++中数组做为形参传递给函数时把数组视为指针,并无将数组的长度信息传递给函数,于是在函数中稍有不慎就会形成数组内存的越界访问。为了不这个问题,下面根据书上给的内容作了一点总结和说明。数组
数组形参的定义函数
void func(int *) {/* ...*/}spa
void func(int[]) {/* ... */}.net
void func(int[10]) {/* ...*/}指针
上面三种形参表示方式都是合法和等价的,能够看到C++将数组视为指针。另外第三种表示方式看上去在方括号中用一个常量指定了数组的长度,但事实上编译器忽略了这一方式指定的数组长度,在函数调用时即便你给func函数传递一个长度不为10的数组编译器一样可让你经过,只不过这在实际运行中可能形成数组内存的越界访问。(注:这种表示方式要和下面介绍的数组引用相区分开来)code
由于C++并不支持将数组的长度信息自动传递给函数,因此咱们在编写代码时必须采起措施来避免数组形参带来的越界访问问题,下面给出几种方法blog
1.显示传递数组长度:在函数定义的参数列表中加多一个表示数组大小的参数,这种作法比较常见,举个例子:内存
void func(int arr[], size_t size) { for (size_t i = 0; i < size; i++) // operation }
2.显示指定数组开始和结束的位置:这种编程风格由标准库所使用的技术启发而得,常见于迭代器的使用,举个例子:字符串
void func(int *begin, int *end) { for (int *pt = begin; pt != end; pt++) // operation }
3.显示添加结束的标记:在数组末尾加多一个标识元素用来检测数组的结束,常见的例子是C风格字符串,它是一种字符数组,而且以空字符null做为结束的标记
void func(char *cstr) { for (int i = 0; '\0' != cstr[i]; i++) // operation }
4.经过引用传递数组:若是形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用自己
void func(int (&arr)[10]) { for (int i = 0; i < 10; i++) // operation } int main() { int size = 20; int iarray[size] = {0}; func(iarray); // error return 0; }
不过这种方式编译器有着严格的规定,使用时要注意如下几点: