C++:引用变量&

引用变量是一种复合类型。

引用是已定义的变量的别名(另一个名称),假设蟑螂的小名叫小强,那么我们说蟑螂和小强就是同一个东西,只是名字不一样。换成变量也一样,假设有变量A,它的引用为B,那么B就是A的别名,A就是B,B就是A,它们的值和地址都一样。

【创建引用变量】

C++将&符号作为地址运算符,假设有个变量C,那么&C就是C的地址(内存单元);同时&符号也可以用来声明引用。

例如:

int a=10;

int &b=a;

int &就是指向int变量的引用。

a和b的值都为10,它们的地址也相同,如果是a或者b变化了(进行了运算),另外一个也会随着改变,这个跟指针差不多,下面用代码来解释更为直接明了,为了跟指针进行对比,代码前一部分为引用,后一部分为指针。

#注意:必须在声明引用变量时将其进行初始化,不然系统会随机给个值。

【代码示例】

 

#include <iostream>
#include <stdlib.h>

int main()
{
	using namespace std;
	int a = 10;
	//引用
	int &b = a;
	cout << "没变时:a = " << a << "\tb = " << b << endl;
	a += 10;
	cout << "a变化后:a = " << a << "\tb = " << b << endl;
	b += 10;
	cout << "b变化后:a = " << a << "\tb = " << b << endl;
	cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b<<"\n\n";
	//指针
	int *c = &a;
	cout << "没变时:a = " << a << "\tb = " << *c << endl;
	a += 10;
	cout << "a变时:a = " << a << "\tb = " << *c << endl;
	*c += 10;
	cout << "*c变时:a = " << a << "\tb = " << *c << endl;
	cout << "此时a的地址为:" << &a << "\tb的地址为:" << c << endl;

	system("pause");
	return 0;
}

【演示结果】

 

如果将一个变量的引用改为另一个变量的引用,那会发生什么情况?

例如:

int a=10;

int &b=a;

int c=20;

b=c;

这样会使得a=b=c,但是&a=&b!=&c;也就是说a、b、c的值相同,但是a和b的地址相同,c却不相同。这是为什么呢?

原因是:引用可以通过初始化声明来设置,像这样int &b=a;但不能通过赋值来设置,像这样子b=c;这样只赋值,而不改变地址,因为a就是b,所以把c的值赋给b,就相当于把值赋给了a,所以才导致了a=b=c,&a=&b!=&c的出现。

【代码示例】

 

#include <iostream>
#include <stdlib.h>

int main()
{
	using namespace std;
	int a =10;
	//引用
	int &b = a;
	cout << "没变时:a = " << a << "\tb = " << b << endl;
	a += 10;
	cout << "a变化后:a = " << a << "\tb = " << b << endl;
	b += 10;
	cout << "b变化后:a = " << a << "\tb = " << b << endl;
	cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b<<"\n\n";
	
	int c = 10;
	b = c;
	cout << "引用变化后:a = " << a << "\tb = " << b <<"\tc = "<<c<< endl;
	cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b <<"\tc的地址为:"<< &c<<"\n\n";
	

	system("pause");
	return 0;
}

 

 

【演示结果】

【将引用用作函数参数】

引用经常被用作函数参数,使得函数中的变量名成为调用函数中变量的别名。而这种传递参数的方法被称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。

传递参数常见的三种方法:1、按值传递 2、按引用传递 3、按地址传递

【按值传递】

例如:

 

void love(int x)
int main()
{
	int a = 10;
	love(a);
}
void love(int x)
{
	x += x;
}


int a=10;

 

love(a);

这里创建了一个变量a,并把值20赋给它;

void love(int x)
{
x += x;
}

这里则创建了一个变量x,将传递的值20赋给x,注意只是传值,所以a和x不是同一个东西,是不同的变量。

【按引用传递】

对刚才的代码进行一下修改:

 

void love(int &x)
int main()
{
	int a = 10;
	love(a);
}
void love(int &x)
{
	x += x;
}

 

int a=10;

love(a);

这里创建了一个变量a,并把值20赋给它,这一部分是没变的;

void love(int &x)
{
x += x;
}

这一部分就变了,加上了引用,那么x就成为了a的别名,也就是说a就x,x就是a,同一个变量,只是名字不同而已,只要两者其中一个改变,另外一个也得跟着改变。

下面的代码就按值传递 、按指针传递 、按引用传递进行比较。比较结果可想而知,按指针传递、按引用传递都能交换love1和love2的值,而按值传递就不行。

【代码示例】

 

#include <iostream>
#include <stdlib.h>

void swap1(int &a,int &b);
void swap2(int *a1,int *b1);
void swap3(int a2,int b2);
int main()
{
	using namespace std;
	int love1 = 10;
	int love2 = 20;
	cout << "-----------------------磊神---------------------------\n";
	cout << "没交换之前:love1 = " << love1 << "\tlove2 = " << love2 << endl;
	swap1(love1, love2); 
	cout << "按引用传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;
	swap2(&love1, &love2);
	cout << "按指针传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;
	swap3(love1, love2);
	cout << "按值传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;

	system("pause");
	return 0;
}

void swap1(int &a, int &b)
{
	int t;
	t = a;
	a = b;
	b = t;
}
void swap2(int *a1, int *b1)
{
	int t;
	t = *a1;
	*a1 = *b1;
	*b1 = t;
}
void swap3(int a2, int b2)
{
	int t;
	t = a2;
	a2 = b2;
	b2 = t;
}

【演示结果】

 

再举一个例子:

下面的代码中,引用变量ra修改了主函数中x的值,而a则没有修改。

【代码示例】

 

#include <iostream>
#include <stdlib.h>
//#include "mytime0.h"
double cube(double a);
double recube(double &ra);


int main()
{
	//using std::cout;
	//using std::endl;
	using namespace std;
	double x=3.0;

	cout << cube(x);
	cout << "此时x = " << x << endl;
	cout << recube(x);
	cout << "此时x = "<<x<<endl;
	
	system("pause");
	return 0;
}

double cube(double a)
{
	a += a;
	return a;
}

double recube(double &ra)
{
	ra += ra;
	return ra;
}

【演示结果】

 




 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值