数组作为参数传递的⽅式
在把数组作为参数传递给函数时,有值传递(byvalue)和地址传递(byreference)两种⽅式。
⼀值传递:
在值传递⽅式中,要在数组参数的尾部加上⼀对⽅括号([]),调⽤函数时只需将数组的地址(即数组名)传递给函数。
例如:如果数组x被声明为:intx[10];
那麽函数被说明为:void print_func(int[]);
参数int[]告诉编译程序print_func()函数只有⼀个参数,即⼀个由int型值组成的数组。函数调⽤时只需将数组名传递给函数:print_func(x);
[cpp]
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]
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修饰符的作⽤是防⽌意外修改初始数组中的某⼀个元素
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论