C++函数的参数三种传值方式为:值传递、地址传递(指针传递,引用传递)
转载未央1117 最后发布于2018-05-08 15:58:14 阅读数 2839 收藏
(1)指针传递与引用传递的区别:
指针参数传递本质上是值传递,它所传递的是一个地址值。值传递过程中,被调函数的形参作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。值传递的特点是,被调函数对形参的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)。
引用参数传递过程中,被调函数的形参也作为局部变量在栈中开辟了内存空间,但此时存放的是由主调函数放进来的实参变量的地址。被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(根据别名找到主调函数中的本体)。因此特点,被调函数对形参的任何操作都会影响主调函数中的实参变量。
【注:】指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
(2)在C++中,函数的形参,什么时候使用引用?什么时候使用指针?什么时候使用按值传递?
1 针对函数内部只使用传递的值而不做修改
(1)数据对象较小,如内置数据类型或小型结构体,则按值传递
void func(int );
(2)数据对象是数组,则只能使用指针,并将指针const指针
void func(const int *,int);//第二个参数为数组长度
(3)数据对象是较大的结构体,则const指针或const引用都行
struct struc{…};
void func(const struc *);
或void func(const struc &);
(4)数据对象是类,则使用const引用
void func(const string &,);
2 针对函数内部不仅使用传递的值且要做修改的
(1)数据对象是内置数据类型,则使用指针
void func(int *);
(2)数据对象是数组,则只能使用指针
void func(int *,int);//第二个参数为数组长度
(3)数据对象是结构体,则使用引用或指针
struct struc{…};
void func(struc *);
或void func(struc &);
(3)数据对象是类,则使用引用
void func(ostream &);
1.值传递:
void fun(int x)
{ x += 5; //修改的只是y在栈中copy x,x只是y的一个副本,在内存中重新开辟的一块临时空间把y的值 送给了x;这样也增加程序运行时间,降低了程序的效率 }
void main(void)
{ int y = 0; fun(y); cout<<\"y = \"<<y<<endl; //y = 0; }
2.指针传递:
void fun(int *x)
{ *x += 5; //修改的是指针x指向的内存单元值 } void main(void)
{ int y = 0; fun(&y); cout<<<<\"y = \"<<y<<endl; //y = 5; }
3.引用传递:引用传递做函数参数”是C++的特性,C语言不支持”
void fun(int &x)
{ x += 5; //修改的是x引用的对象值 &x = y; }
void main(void)
{ int y = 0; //引用的实参必须初始化 fun(y); cout<<<<\"y = \"<<y<<endl; //y = 5; }
例如:数据结构带&与不带&
带&的是引用型参数,它是地址传递,其实参会随着形参的改变而改变;
不带&的参数是一般参数,是值传递,其实参不会随着形参的改变而改变。