引用是某一变量的一个别名,使用“&”符号标识。引用格式为:数据类型& 引用名 = 变量名
并且在C++中,&
只是起到标识的作用
下面是个例子,可以自己运行看看结果:
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int& ra = a;//指向变量a引用ra
cout << "变量a的地址:" << hex << &a << endl;
cout << "引用ra的地址:" << hex << &ra << endl;
cout << "变量ra的值:" << dec << ra << endl;
return 0;
}
//引用在定义时必须初始化,且与变量类型保持一致
//引用在初始化时不能绑定常量值,如int &b = 10是错误的
//引用在初始化后,其值不能再更改,也就是不能用作其他变量的引用
另外一个例子
#include <iostream>
using namespace std;
void exchange(int& x, int& y)//如果为普通变量值传递,由于副本机制无法实现a,b的交换,如果以形参址传递,通过分配存储单元,在调用时反复使用“*指针名”获取数据,很容易出现错误。但是使用引用作为形参,就不会
{
int temp = x;
x = y;
y = temp;
}
int main()
{
int a, b;
cout << "please input two nums:" << endl;
cin >> a >> b;
exchange(a, b);
cout << "exchanger:" << a << " " << b << endl;
return 0;
}
//指针是隐式的指针,需要占据额外的内存单元,而引用指向一个变量,不占据额外内存单元
//作为函数参数时,指针的实参是变量的地址,而引用的实参是变量本身,但系统向引用传递的是变量的地址而不是变量的值
如果想使用常量值初始化应用,则必须使用const
修饰,这种引用也叫常引用
const int &a=10;//引用a,使用常量10进行初始化 const int b=10;//定义常量b const int &rb=b;//定义引用rb,使用常量b进行初始化
但是const引用可以使用普通变量进行初始化,只是不允许通过该引用修改变量的值
int a=10;//变量a const int &b=a;//使用a初始化const引用b b=20;//错误
当引用做函数参数时,也可以使用const进行修饰,表示不能再函数内部修改参数的值
bool isLonger(const string &s1,const string $s2) { return s1.size() > s2.size(); }//在该函数中,只能比较两个字符串长度而不能改变字符串内容
典例
一
输入:数a 数b
输出:数a,数b
数b,数a
#include<iostream>
#include<iomanip>
using namespace std;
void swap1(int x, int y)
{
int t;
t = x;
x = y;
y = t;//此处并没有返回x,y的值给a,b。也就是x,y为一个临时值
}
void swap2(int &x, int &y)//与上面不同的是,此处使用了引用,也就是变量a引用x,变量b引用y
{
int t;
t = x;
x = y;
y = t;
}
void swap3(int* x, int* y)
{
int t;
t = *x;
*x = *y;
*y = t;
}//这是我格外想到一种方式,通过指针来对a,b进行交换,但是上方已经提到了该用法的弊端,在调用时反复使用“*指针名”获取数据,很容易出现错误
int main()
{
int a, b;
cin >> a >> b;
swap1(a, b);
cout << a << "," << b << endl;
swap2(a, b);
cout << a << "," << b << endl;
swap3(&a, &b);
cout << a << "," << b << endl;
return 0;
}
//在这个程序中,&和*都是与指针相关的操作符,但它们的作用是截然不同的。
//&是取地址运算符,用于获取一个变量的地址。在这个程序中,&被用于将变量的地址传递给函数。例如,在函数swap2中,int &x和int &y声明了两个引用类型的参数,这意味着当函数被调用时,将会直接使用实参的地址,而不是实参的副本。这就实现了通过函数交换两个变量的值。
//*是解引用运算符,用于获取指针指向的变量的值。在函数swap1的修改版本中,int *x和int *y声明了两个指针类型的参数,这意味着当函数被调用时,需要传递实参的地址。在函数内部,*x和*y分别表示x和y所指向的变量的值。这样,通过指针,函数可以直接修改实参的值,从而实现了交换两个变量的值。
//因此,&和*虽然都与指针有关,但它们的作用是不同的。&用于获取地址,*用于获取指针所指向的值。
二
#include<iostream>
#include<iomanip>
using namespace std;
void swap(int *&p,int *&q)//将指向a和b的指针的地址传递给函数
{
int* t;
t = p;
p = q;
q = t;
}//交换了指向a和b的指针的地址,从而实现了交换p1和p2所指向的变量的值
//使用引用类型的参数,才能正确地交换指针的值。如果使用普通的指针类型或值类型的参数,交换的只是指针或变量的副本,而不是实际的指针或变量
int main()
{
int a;
int b;
int* p1;
int* p2;
p1 = &a;
p2 = &b;//定义了两个指针p1和p2,并分别指向a和b
cin >> a >> b;
swap(p1, p2);//调用函数swap
cout << a << "," << b << endl;
cout << *p1 << "," << *p2 << endl;
return 0;
}
//这个比较难