<<C++ Primer>> 第四版中Exercise Section 7.2.5 中有习题7.13如下:编写程序计算数组元素之和。
首先,数组作为形式参数有两种,第一种是引用形式,第二种是非引用形式。
引用形式:参数传递时带上了数组的大小,这样只能传递进大小一样的数组。
非引用形式:参数传递时没有带上数组大小,这样会导致在编译时,只要传递的是相同类型的指针,那么编译都是可以通过的。
针对非引用形式的数组形参传递,数组会被转换为指向第一个元素的指针,复制这个指针的值并用来初始化形参。因此下面三个形式的形参声明其实是一样的,形参类型都是 int*
int fun(int *p)
int fun(int p[])
int fun(int p[10])
看下面的例子:
#include "stdafx.h" #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[2] = {1,2}; int *p = 0; int pc[] = {0,1,2,3,4,5,6,7,8,9}; printValues(pc); printValues(i); printValues(p); return 0; }
代码全部被编译通过,但是当执行时,结果会变成这样:
这里只要是int 型的指针传递进函数printvalues,编译都通过了,但是程序运行时,却抛出异常。
再来看引用参数的传递:
#include "stdafx.h" #include <iostream> using namespace std; void printValues2(int(&arr)[10]) { for (size_t i = 0; i < 10; ++i) { cout << arr[i] << endl; } } int main() { int i[2] = {1,2}; int *p = 0; int pc[] = {0,1,2,3,4,5,6,7,8,9}; printValues2(pc); printValues2(i); printValues2(p); return 0; }
这里代码:
printValues2(i); 编译提示错误:

printValues2(p);编译提示错误:
注释掉这两行后,程序编译通过,运行成功,打印出pc 数组的各个值。
较为常见的是传递非引用数组类型的作为参数。这样做有一个关键点就是如何确保程序能够处理数组范围之内的数据。书上列举出了三种方式:
1 在数组末尾放置一个标识符,用来标识数组末尾。类似的情况就像C风格字符串。
2 使用标准库方式,传入数组第一个元素的指针和最后一个元素的指针。
3 显式传递数组大小。
先看第一种方式:
#include "stdafx.h" #include <iostream> using namespace std; void printValues_01(int *p) { while (*p) { cout << *p++ << endl; } } int main() { int temp = 0; int i[3] = {1,2,NULL}; int *p = &temp; int pc[] = {1,2,3,4,5,6,7,8,9,NULL}; printValues_01(pc); return 0; }
打印出的结果为:
第二种方式为:
#include "stdafx.h" #include <iostream> using namespace std; void printValues_02(const int* begin,const int* end) { while (begin!=end) { cout << *begin++ << endl; } } int main() { int temp = 0; int i[3] = {1,2,NULL}; int *p = &temp; int pc[] = {1,2,3,4,5,6,7,8,9,NULL}; printValues_02(pc,pc+10); return 0; }
第三种方式多加一个参数即可。