操作引用:
&只有在声明引用时是引用操作符,其他时候都是地址操作符。
引用和变量指向同一个存储单元:
引用一旦初始化,它就维系在一定的目标上,再也不分开
例:
int val = 0;
int& r_val = val;
cout << &val << endl;
cout << &r_val << endl;
输出的地址相同。
--------------------------------------------------------------------------------------
引用和指针的区别:
指针是个变量,可以把它再赋值成指向别处的地址。
建立引用时必须进行初始化并且决不会再关联其他不同的变量。
由于指针也是变量,所以可以有指针变量的引用:
int* a = NULL;
int*& r_pa = a; // 表示int*的引用r_pa初始化为a
int b = 8;
r_pa = &b; // r_pa是a的别名,是一个指针
-------------------------------------------------------------------------------------------
void引用时不合法的。
void& a = 3; // void只是语法上相当于一个类型,本质上不是类型,而且没有任何一个变量或对象,其类型为void
不能建立引用的数组。
int a[10] = {0};
int& r_a[10] = a; // error
没有引用的指针,没有引用的引用。
int a;int& r_a = a;
int&* p = &r_a; // error 企图定义一个引用的指针
有空指针,无空引用。
---------------------------------------------------------------------------------------------
引用的参数传递:
传递引用给函数与传递指针的效果一样。
用引用作为参数比使用指针有更清晰的语法。
函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本,所以提高了效率。
int result = 0;
int& func(int r) // 返回引用
{
result = r*r;
return result;
}
#include <iostream>
using namespace::std;
void foo(int val)
{
val = 10;
}
void bar(int& val)
{
val = 10;
}
void zoo(int* pval)
{
*pval = 10;
}
int main1(int argc, char *argv[])
{
int a = 1; int b = 1; int c = 1;
foo(a); // 传递了a的副本,a还是为1
bar(b); // 传递了b的引用/地址,b被改为10
zoo(&c); // 传递了c的指针,指针指向的内容被修改,c被改为10
cout << a << " " << b << " " << c << endl;
return 0;
}