在把数组作为参数传递给函数时,有值传递(byvalue)和地址传递(byreference)两种方式。
一值传递:
在值传递方式中,要在数组参数的尾部加上一对方括号([]),调用函数时只需将数组的地址(即数组名)传递给函数。
例如:如果数组x被声明为:intx[10];
那麽函数被说明为:void print_func(int[]);
参数int[]告诉编译程序print_func()函数只有一个参数,即一个由int型值组成的数组。 函数调用时只需将数组名传递给函数:print_func(x);
[cpp]view plaincopy
1 #include<stdio.h>
2 void print_func(int[]);
3 void main(void)
4 {
5 int x[10];
6 int y;
7 for(y=0;y<10;y++)
8 x[y]=y;
9 print_func(x);
10 }
11 void print_func(int i[])
12 {
13 int y;
14 for(y=0;y<10;y++)
15 printf("%d/n",i[y]);
16 }
在值传递方式中,数组x将被复制一份,复制所得的数组将被存放在栈中,然后由print_func()函数接收并打印出来。由於传递给print_func()函数的是初始数组的一份拷贝,因此在print_func()函数内部修改传递过来的数组对初始数组没有任何影响。
值传递方法的开销是很大的,因为首先它要完整地复制初始数组并将这份拷贝存放到栈中,这将耗费相当可观的运行时间, 因而值传递方法效率较低;其次,初始化数组的拷贝需要占用额外的内存空间(栈中的内存);最后,编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。
二 地址传递
该方法克服了值传递方法的缺点。在地址传递方法中,传递给函数的是指向初始数组的指针,不用复制数组,因此程序变得简练,也节省了栈中的内存空间。在地址传递过程中,只需在函数原形中将函数的参数说明为指向数组元素数据类型的一个指针。
例如同样定义一个数组x:intx[10];
那麽函数被说明为:int const_funt(const int*);
参数const int*告诉编译程序const_funt()函数只有一个参数,即指向一个int类型常量的指针。
函数调用时只需将数组的地址传递给函数:const_func(x);
[cpp]view plaincopy
17 #include <stdio.h>
18 void print_func1(const int*);
19 void main(void)
20 {
21 int x[10];
22 int y;
23 for(y=0;y<10;y++)
24 x[y]=y;
25 print_func1(x);
26 }
27 void print_func1(const int*i)
28 {
29 int y;
30 for(y=0;y<10;y++)
31 printf("%d/n",*(i+y));
32 }
在地址传递方式中,没有复制初始数组并将其拷贝存放在栈中,print_func1()函数只接收到指向一个int类型常量的指针,因此在编写程序时要保证传递给print_func1()函数的是指向一个由int类型常量组成的数组的指针。const修饰符的作用是防止意外修改初始数组中的某一个元素