引用

引用是某一变量的一个别名,使用“&”符号标识。引用格式为:数据类型& 引用名 = 变量名

并且在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;
}
//这个比较难

发表评论