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] 的内容。



图 1 collection 数组和 nums 形参变量之间的关系

本文标题:C++数组做函数参数详解

本文地址:https://www.hosteonscn.com/3776.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注