传引用函数
A. Java函数传递引用和值的区别
引用传递的是复对象的制地址,值传递的是变量的值
使用引用传递,被调用函数使用的是调用函数传入的对象本身,也就是说在被调用函数中对对象进行修改将直接导致外部对象的值被修改。
而值传递,传递进去的是变量的副本(即拷贝),此时在被调用函数中对形参的任何修改都不会改变外部变量的值。
引用你可以直接理解成对象的别名。例如有有函数Test(String str);对象String name;
调用Test:Test(name);
则在Test里面str其实是name外部变量的别名,他们所代表的是同一个对象,所以Test函数修改str即修改name
B. C++关于函数的传值和传地址传引用的区别
#include<stdio.h>
voidplus(intp,int*q){
p++;
(*q)++;
}
main(){
inta=1;
intb=1;
plus(a,&b);//把a的值和b的地址传给plus函数
printf("a=%d,b=%d ",a,b);//经过plus处理,得到结果,a不变,b变;
}
C. C++ 函数传指针和传引用的区别
指针抄是用来指向某个变量,而引用是给变量取个别名,其作用就如同typedef一样。 用引用作形参时在调用函数里就像操作实参一样,不需要考虑实参的地址问题 用指针做形参时,由于指针的值是变量的地址,所以要通过对地址解引用来操作其所指的变量。
D. 引用作为函数的参数有什么优缺点
使用引用传参的话来,在函数自中对该变量所做的修改,在函数返回后依然存在。这未必是程序员所希望的。
E. C语言到底支不支持引用传递做函数参数
“引用传递做函数参数”是C++的特性,C语言不支持。
//C语言要这样写:
voidExchg3(Rect*x,Rect*y){/*...*/}
//然后传递指针:
Exchg3(&a,&b);
F. 为什么说向函数传递引用实现了形参和实参的数据双向传递。
引用传递就是将实参地址传递给函数,函数接收到地址后并不另外在栈上专分配临时内存空属间储存该地址,而是直接当做实参本身使用,如果实参含有有效数据,则函数可以通过引用直接取出(读),也可以对其赋值(写)。如果将实参传递给函数称为正传递,那么函数返回数据就是逆传递。
由于函数返回值是通过退栈方式传递,而且编译器约定,一次返回只能为一个数据(值或者是对象/数组地址)。很多时候我们会遇到需要一个函数返回多个数据,一种方案是在堆上建一个结构,采用结构返回多个数据,还可以采用引用传递,函数除了通过return返回一个数据外,我们可以在函数参数中定义多个引用形参,外部代码调用时将外部多个变量(实参)的地址按引用形式传递给函数(正传递),将数据传递给函数,函数处理完了后将结果赋值给被引用的变量而改写实参(逆传递)。
G. C语言中函数参数传递问题:引用传递。
参数3中传递方式.
值传递,址传递,
引用传递.
后两者
才是对传入的参数的实际操作.
第一个是
操作的
传入参数的拷贝副本.
H. 按引用传递传的是什么
C++中的函数有时候会采用按引用的参数传递和返回。比如:
int& f(int& a){
a++;
return a;
}
“按引用进行参数传递”很好理解:
通常使用的“按指传递”,函数内的操作的实际上是输入参数的一个副本(即函数创建了一个临时变量,其值与输入参数完全相同),对该副本的操作不会影响输入参数的值。
而“按引用传递”,可以理解为副本是一个引用变量,该副本与输入参数共享存储区。因此函数内对副本的修改相当于对输入参数进行修改。
当输入参数是抽象数据类型时,采用“按引用传递”可以避免创建副本时构造函数的调用(以及函数返回时析构函数的调用)。因此按引用传递会比按值传递更有效率。
而“按引用进行函数值返回”有点tricky:
“按指返回”实际上也是在函数中创建一个临时变量,用于返回。
1)如果返回值类型是内部类型,那么编译器通常会在函数返回时将返回值放在register中,然后再从register中将其取出赋给相应的变量。
2) 如果返回值类型是抽象类型,register可能没有足够大的空间来存储返回值的数据。那么这时候编译器在将输入参数压栈之后,调用函数之前,将返回值的地址压栈。这样在函数返回的时候直接将数据写到返回值在栈中的位置处。
而“按引用返回”,对于返回值有一定的限制:即返回值不能是局部变量,必须能生存在函数作用域之外。
比如下面三种情况,第一种是错误的,后面两种是正确的:
int& f(int& a){
int b = a;
b++;
return b;
}
int& f(int& a){
a++;
return a;
}
int& f(int& a){
static int b = 0;
return b;
}
也就是说,按引用传递的返回值的存储区都是在函数之外,因此操作就简单的多了,编译器在函数调用期间一直对返回值的地址操作,在函数结束返回时,返回的实际上是返回值在函数外部的存储区中的值。
I. 将“引用”作为函数参数有哪些特点
传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标 对象(在主调函数中)的操作。 ②使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的 副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比 用一般变量传递参数的效率和所占空间都好。 ③使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用”*指针变量名”的形式进行运算,这很容易产生错误且程序的阅 读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
J. 函数调用是传值还是传引用
函数传值,只是起到一个“传”的作用,在调用函数中修改,只会在内调用函数的这个作用容域中起作用。
函数传地址,一般通过传指针或传引用。它在调用函数的时候,如果改变了传入地址中的数据,即地址所指向的地址空间。
而通过传值,相当于在内存中拷贝了一份,在调用函数中,只改变了拷贝值所在的地址空间的数据,而不是改变所传入值的地址空间的数据
a1和a2都是运行了,只是a2运行的并没有改变传入的值!