C语言技巧:怎样把数组作为参数传递给函数?

在把数组作为参数传递给函数时,有值传递(by value)地址传递(by reference)两种方式。在值传递方式中,在声明定义函数时,要在数组参数的尾部加上一对方括号([]),调用函数时只需将数组的地址(即数组名)传递给函数。例如,在下例中数组x[]是通过值传递方式传递给byval_func()函数的:

#include <stdio.h>
int byval_func(int []);       /* 
                               * The byval_func() function is passed an
                               * integer array by value.
                               */
int main (int argc, char *argv[])
{
    int x[10];
    int y;
     /* Set up the integer array. */
     for (y = 0 ; y < 10; y++)
        x[y] = y;
     /* Call byval_func() ,passing the x array by value. */
     byval_func(x);
     return 0;
}
/* The byval_function receives an integer array by value. */
int byval_func(int i[])
{
     int y;
     /* print the content: of the integer array. */
     for (y = 0; y < 10; y++)
     {
         printf("%d\n", i[y]);
     }
     return 0;
}

在上例中,定义了一个数组名为x的数组,并对它的10个元素赋了初值。函数byval_func()的声明如下所示:
int byval_func(int []);
参数int []告诉编译程序byval_func()函数只有一个参数,即一个由int类型值组成的数组。在调用byval_func()函数时,只需将数组的地址传递给该函数,即:

byval_func(x);

在值传递方式中,数组x将被复制一份,复制所得的数组将被存放在栈中,然后由byval_func()函数接收并打印出来。由于传递给byal_func()函数的是初始数组的一份拷贝,因此在byval_func()函数内部修改传递过来的数组对初始数组没有任何影响。
值传递方式的开销是非常大的,其原因有这样几点:
第一,需要完整地复制初始数组并将这份拷贝存放到栈中,这将耗费相当可观的运行时间,因而值传递方式的效率比较低;
第二,初始数组的拷贝需要占用额外的内存空间(栈中的内存);
第三,编译器需要专门产生一部分用来复制初始数组的代码,这将使程序变大。

地址传递方式克服了值传递方式的缺点,是一种更好的方式。在地址传递方式中,传递给函数的是指向初始数组的指针,不用复制初始数组,因此程序变得精练和高效,并且也节省了栈中的内存空间。地址传递方式中,只需在函数原型中将函数的参数声明为指向数组元素数据类型的一个指针。请看下例:

#include <stdio.h>
int const_func(const int *);
int main(int argc, char *argv[])
{
    int x[10];
    int y;
    /* Set up the integer array. */
    for (y = 0; y < 10; y++)
    {
        x[y] = y;
    }
    /* Call const_func(), passing the x array by reference. */
    const_func(x);
    return 0;
}
/*
 * The const_function receives an integer array by reference.
 * Notice that the pointer i » declared aa const, which renders
 * it unmodif table by the const_funcO function. 
 */
int const_func(const int *i)
{
    int y;
    /* print the contents of the integer array. */
    for (y = 0; y < 10; y++)
    {
        printf("%d\n", * (i + y));
    }
    return 0;
}

在上例中,同样定义了一个名为x的数组,并对它的10个元素赋了初始值。函数const_func()的声明如下所示:
int const_func(const int *);
参数const int *告诉编译器,const_func()函数只有一个参数,即指向一个int类型(基本整型)常量的指针。在调用const_func()函数时,同样只需将数组的地址传递给该函数,即:const_rune(x);
在地址传递方式中,没有复制初始数组并将其拷贝存放在栈中,const_rune()函数只接收到一个指向一个int类型(基本整型)常量的指针,因此在编写程序时要保证传递给const_func()函数的是指向一个由int类型值组成的数组的指针。const修饰符的作用是防止const_func()函数意外地修改初始数组中的某一个元素。
地址传递方式唯一的不足之处是必须由程序本身来保证将一个数组传递给函数作为参数,例如,在函数const—rune()的原型定义中,都没有明确指示该函数的参数是指向一个由int类型值组成的数组的指针。然而,地址传递方式速度快,效率高,因此,在对运行速度要求比较高时,应该采用这种方式。

你可能感兴趣的:(C语言技巧:怎样把数组作为参数传递给函数?)