C++数组做函数参数详解
程序员通常会想要编写函数来处理数组中的数据。例如,可以编写函数将值放入数组中、在屏幕上显示数组的内容、累计数组的所有元素或计算其平均值。通常,这样的函数将接收一个数组作为参数。
当某个数组的单个元素被传递给一个函数时,它就像任何其他变量一样被处理。例如,下面程序显示了一个循环:
//This program demonstrates that an array element //can be passed to a function like any other variable. #include <iostream> using namespace std; void showValue(int); // Function prototype int main() { const int ARRAY_SIZE = 8; int collection[ARRAY_SIZE] = {5, 10, 15, 20, 25, 30, 35, 40}; for (int index = 0; index < ARRAY_SIZE; index++) showValue(collection[index]); cout << endl; return 0; } void showValue(int num) { cout << num << " "; }
程序输出结果:
5 10 15 20 25 30 35 40
此程序中,每次执行循环时都会将 collection 数组的一个元素传递给 showValue 函数。因为 collection 数组的元素是 int 整数,所以每次调用时都会将一个 int 值传递给 showValue 函数。请注意这在 showValue 函数原型和函数头中是如何指定的。实际上,showValue 只知道它正在接收一个 int,至于数据是不是来源于一个数组则无关紧要。
由于 showValue 函数只是显示 num 的内容,并不需要直接处理数组元素本身,所以数组元素可以通过值传递给它。如果函数需要访问原始数组的元素,则它们将需要通过引用进行传递。
如果函数被编写为接收整个数组作为实参,则形参的设置将迥然不同。在下面的函数定义中,形参 num 之后是一组空的方括号。这表明实参将会是整个数组,而不是单个值。
void showValues (int nums[], int size) { for (int index = 0; index < size; index++) cout << nums[index] << " "; cout << endl; }
请注意,与包含值的数组一起,数组的大小也被传递给 showValues。这样就可以知道需要处理多少个值。
还要注意在 nums 的方括号内没有大小声明符,这是因为 nums 实际上不是一个数组,它只是一个接收数组地址的特殊变量。当整个数组传递给一个函数时,它不会被通过值传递。
想象一下,如果在每次传递给一个函数时都需要创建一个 10000 元素数组的副本,那该需要消耗掉多少 CPU 时间和内存!所以,被传递的只能是数组的起始内存地址。这与通过引用将变量传递给函数类似,只不过在这种情况下不使用 &。
下面程序演示了函数 showValues 如何接收整个数组的地址,这样它就可以访问和显示其所有元素的内容:
// This program shows how to pass an entire array to a function. #include <iostream> using namespace std; void showValues(int intArray[], int size); // Function prototype int main() { const int ARRAY_SIZE = 8; int collection[ARRAY_SIZE] = {5, 10, 15, 20, 25, 30, 35, 40}; cout << "The array contains the values\n"; showValues(collection, ARRAY_SIZE); return 0; } void showValues (int nums[], int size) { for (int index = 0; index < size; index++) cout << nums[index] << " "; cout << endl; }
程序输出结果为:
The array contains the values
5 10 15 20 25 30 35 40
仔细观察第 5 行中的 showValues 原型和第 14 行中的函数头,在这两种情况下,都有一对方括号紧跟第一个参数名称,这让程序知道这个形参将接收一个数组的地址。如果函数原型没有使用形参名称,那么它看起来将像这样:
void showValues(int [],int);
这仍然表示第一个 showValues 形参将接收一个整数数组的地址,第二个形参则接收一个整数值。
再来看下面的语句,在程序的第 11 行如何调用 showValues 函数:
showValues(collection, ARRAY_SIZE);
第一个实参是传递给函数的数组的名称。请记住,在 C++ 中,没有方括号和下标的数组的名称实际上是数组的开始地址。在这个函数调用中,collection 数组的地址被传递给函数。第二个实参是该数组的大小。
在 showValues 函数中,collection 数组的开始地址被复制到 nums 形参变量中。nums 变量然后被用于引用 collection 数组。图 1 说明了 collection 数组和 nums 形参变量之间的关系。当显示 nums [0] 时,实际上屏幕中出现的是 collection [0] 的内容。
发表评论