http://blog.csdn.net/zenny_chen/archive/2008/06/04/2512056.aspx C/C++中取地址符&的语义
http://zhishi.sohu.com/question/35975900.html C++中的&是什么意思及常见用法
http://blog.csdn.net/zjfei/archive/2010/03/30/5432122.aspx C,C#,C++中&&和||,&和|的联系和区别
http://www.dnbcw.com/biancheng/c/frsc79380.html 小议C#中的“&”按位与运算符
算法中形参中的&是指C语言里面的地址还是C++中的引用?
c语言中形参表示指针用*,实参中的地址才用&,形参中用&的是c++里面的引用,下面分别为两段代码:
//函数venus(int &a)中的&是引用
#include "stdio.h"
void venus(int &a){
printf("x : %d",a);
}
int main()
{
int a = 0;
int &r = a;
venus(r);
return 0;
}
//函数venus(int *a)中的*是指针
#include "stdio.h"
void venus(int *a){
printf("x : %d",a);
}
int main()
{
int a = 0;
int &r = a;
venus(&r);
return 0;
}
引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。
【例2】:
void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用
{ int p; p=p1; p1=p2; p2=p; }
为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。如:对应上面定义的swap函数,相应的主调函数可写为:
main( )
{
int a,b;
cin> > a> > b; //输入a,b两变量的值
swap(a,b); //直接以变量a和b作为实参调用swap函数
cout < <a < < ' ' < <b; //输出结果
}
上述程序运行时,如果输入数据10 20并回车后,则输出结果为20 10。
由【例2】可看出:
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用 "*指针变量名 "的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。