c++的引用

以下内容包括引用的五点:
1.引用与指针的区别与联系
2.普通引用(&p)与指针(*p)做函数参数(目的是将变量的地址传递给调用函数)
3.函数的返回值为引用的两种接收问题
4.当返回的引用是静态变量或者全局变量时的做左值和右值问题
5.普通引用与常引用的初始化方式与区别
--------1.--------引用与指针的区别与联系
c++的引用就是相当于简化的指针传递地址的操作,在c语言中,我们需要创建指针:类型 *变量名=NULL;然后通过&符取地址传递给指针变量。而引用是简化了取地址这一步,创建一个引用:类型& 变量名=其他同类型变量,此时,其他变量的地址隐藏的传递给了引用变量。

void main()
{
//引用的格式就是: 类型名称& 新的变量名称 = 原名称 ;引用的本质是一个常量的内存地址: 类型名称 *const  新的名称
	int a = 10;
	int &b = a;//引用。b就是a,a就是b。其实是内存地址的赋予
	b = 20;
	cout << "b=" << b << endl;//b=20
	int* c = &a;//指针传递
	cout << *c << endl;//将地址内容转成数据
}

--------2.--------普通引用与引用做参数:
普通引用必须初始化,引用做参数就不需要初始化

//普通引用时,变量必须初始化
void main()
{
	int a;
	//int &b;//普通引用时,变量必须初始化,即&b必须=一个变量;如果不初始化就相当于指针没有初始化,变成了野指针
	//cout << "b=" << b << endl;
}
//引用做函数参数声明时,可以不进行变量初始化
void change1(int a, int b)//这样的交换并不能交换数的本体,交换的只是a和b的值而并非x、y的值
{
	int c;
	c = a;
	a = b;
	b = c;
}
void change2(int *a, int *b)//&表示的是取变量地址,a,b表示这个变量的地址。*a,*b表示的是这个地址变量的值,change2就是交换了变量的地址,所以可以交换x、y的数据
{
	int c;
	c = *a;
	*a = *b;
	*b = c;
}
void change3(int &a,int &b)//引用做参数声明时,可以不用初始化。引用变量就是内存地址的交换,a就是x,x就是a
{
	int c;
	c = a;
	a = b;
	b = c;
}
void main()
{	
	int x = 10,y = 20 ;
	change1(x, y);//值传递,因为change1并没有值返回,所以x和y的值并没有交换
	printf("x=%d,y=%d\n",x,y);//x=10,y=20

	change2(&x, &y);//change2将x和y的地址传递给形参指针,因为地址指向的内容发生了改变,所以x和y也发生了交换
	printf("x=%d,y=%d\n", x, y);//x=20,y=10
	
	x = 100, y = 200;
	change3(x, y);//change3将变量x和y传递给形参引用,就相当于change2传递给指针,只是不需要在传递的时候用&符取地址传递
	printf("x=%d,y=%d\n", x, y);//x=200,y=100
}

--------3.--------函数的返回值是引用有两种情况去接收:
1.当用一个变量去接收时,变量得到返回的引用值
2.当用一个引用去接收时,引用变量得到的是返回引用变量的地址

int function1()//返回一个值
{
	int a = 0;
	a++;
	return a;
}
int& function2()//返回一个引用(因为引用就是变量的一个替身)
{
	int a = 0;
	a++;
	return a;
}
void main()
{
	int a1 = function1();//将值赋给变量(得到a的值)
	int a2 = function2();//将引用的值赋给变量(得到a的值)
	int& a3 = function2();//将引用的值赋给引用(得到a的地址)
}

--------4.--------特殊情况,当引用是静态变量 或者是 全局变量可以作为右值也可以作为左值

int& function4()//返回一个变量(因为引用就是变量的一个替身)
{
	static int a = 0;
	a++;
	return a;
}
void main()
{
	//作右值
	int a2 = function4();//将引用的值赋给变量(得到a的值)
	cout << "a2=" << a2 << endl;

	//作左值
	function4() = 200;
	cout << function4()<< endl;
}

--------5.--------普通引用与常引用的初始化方式与区别

//常引用的知识架构,引用分为普通引用和常引用
void main()
{
	//1.普通引用,是指将变量的所有属性均赋予给引用,
	int  a = 10;
	int &b = a;
	b = 20;//it is ok to change the a valve
	printf("b:%d \n", b);

	//2.常引用,是只将变量的只读属性赋予给引用,不能修改变量的初始值
	int  x = 20;
	const int &y = x;  //常引用 是 让变量 引用只读属性 不能通过y去修改x了
	//其中,常引用的初始化方式分为2种情况
			//<1> 用变量 初始化 常引用
				{
					int x1 = 30;
					const int &y1 = x1; //用x1变量去初始化 常引用
				}
			//<2> 用字面量 初始化 常量引用
				{
					const int a = 40;  //c++编译器把a放在符号表中
					//其中,需要注意的一个问题就是,常引用可以用字面量来初始化,而普通引用不能直接使用字面量来初始化
					{
					//int &m = 41; 普通引用,引用一个字面量是不可以的,因为字面量有没有内存地址,而引用就是地址的一个别称。没有地址的字面量不能谈普通引用
					const int &m = 43;  //而常引用,c++编译器 会 分配内存空间给字面量,所以常引用的初始化可以用字面量来初始化
					}	 
				}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值