“C++中,数组只能通过值参数和引用参数两种方式传递函数。”这句话错在哪里?怎么改正?

“C++中,数组只能通过值参数和引用参数两种方式传递函数。”这句话错在哪里?怎么改正?

C++中,数组只能通过值参数和引用参数两种方式传递函数。
数组不能通过值参数传递函数

C中函数调用是按值传递御简的,传入参数在子函数中只是一个初值相等的副本,无法对传入参数作任何改动。但实际编程中,经常要改动传入参数的值。这一点我们可以用一个小技巧,即“传入参数的地址而不是原参数本身镇皮裤,当对传入参数(地址)取“*”运算时,就可握枝以直接在内存中修改,从而改动原想作为传入参数的参数值。
传参有三种方式:值参数、指针参数和引用参数
在把数组作为参数传递给函数时,有值传递(by value)和地址传递(by reference)两种方式。
在值传递方式中,要在数组参数的尾部加上一对方括号([]),调用函数时只需将数组的地址(即数组名)传递给函数。
例如:如果数组x被声明为:int x[10];
那麽函数被说明为:void byval_func(int[]);
参数int[]告诉编译程序byval_func()函数只有一个参数,即一个由int型值组成的数组。 函数调用时只需将数组名传递给函数:byval_func(x);
#include
void byval_func(int[]);
void main(void);
void main(void)
{
int x[10];
int y;
for(y=0;y<10;y++)
x[y]=y;
byval_func(x);
}
void byal_func(int i[])
{
int y;
for(y=0;y<10;y++)
printf("%d\n",i[y]);
}
在值传递方式中,数组x将被复制一份,复制所得的数组将被存放在栈中,然后由byval_func()函数接收并打印出来。由於传递给byval_func()函数的是初始数组的一份拷贝,因此在byval_func()函数内部修改传递过来的数组对初始数组没有任何影响。
值传递方法的开销是很大的,因为腊明首先它要完整地复制初始数组并将这份拷贝存放到栈中,这将耗费相当可观的运行时间, 因而值传递方法效率较低;其次,初始化数组的拷贝需要占用额外的内存空间(栈中的内存);最后,编译程序需要专门产生一拦漏部分用来复制初始数组的代码,这将使程序变大。
地址传轮衡告递方法克服了值传递方法的缺点。在地址传递方法中,传递给函数的是指向初始数组的指针,不用复制数组,因此程序变得简练,也节省了栈中的内存空间。在地址传递过程中,只需在函数原形中将函数的参数说明为指向数组元素数据类型的一个指针。
例如同样定义一个数组x:int x[10];
那麽函数被说明为:int const_funt(const int*);
参数const int*告诉编译程序const_funt()函数只有一个参数,即指向一个int类型常量的指针。
函数调用时只需将数组的地址传递给函数:const_func(x);
#include
void const_func(const int*);
void main(void);
void main(void)
{
int x[10];
int y;
for(y=0;y<10;y++)
x[y]=y;
constl_func(x);
}
void const_func(const int*i)
{
int y;
for(y=0;y<10;y++)
printf("%d\n",*(i+y));
}
在值传递方式中,没有复制初始数组并将其拷贝存放在栈中,const_func()函数只接收到指向一个int类型常量的指针,因此在编写程序时要保证传递给const_func()函数的是指向一个由int类型常量组成的数组的指针。const修饰符的作用是防止意外修改初始数组中的某一个元素。
← 上一篇: 下一篇: →