• 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 形参变量之间的关系

更多...

加载中...