引用、引用和指针的联系和区别

一、引用的概念:
引用不是新定义一个变量,是给已经存在的变量取一个别名,编译器不会给引用变量开辟空间,它和被引用的实体共用同一块内存空间。
二、引用格式:
类型& 引用变量名 = 引用实体
三、引用的几个特性:
1.引用在定义是必须初始化。

int a = 10;
int& ra = a;

2.引用前必须有实体,只能引用一个实体,但一个实体可以有多个引用。

int a = 10;
int b = 20;
int& ra = a;
//int& ra = b; 这种写法是错误的
int& rra = a; 

3.引用变量的生命周期小于等于实体的生命周期长。

int a = 10;
if(1)
{
	int& ra = a;//引用变量ra的生命周期短
}

4.不能引用常量。

const a = 10;
//int& ra = a;这种写法是错误的
//int& rb = 10;这种写法是错误的

5.引用的类型必须与被引用实体的类型相同。

int a = 10;
//char& ra = a;这种写法是错误的

6.普通类型引用,需要时常量。(需要const修饰)

double a = 10.11;
const int& ra = a;

四、引用的优缺点:
1.可以通过函数实参改变外部的实参。

int a = 10;
int b = 20;

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}

Swap(a,b);//a、b的值互换

2.如果使用不当,会影响外部的实参。
3.如果以引用的方式作为函数的返回值类型,不能返回栈上的空间。

int& test()
{
	int ret = 10;
	return ret;
}

int main()
{
	int& a = test();
	printf("%d\n",a);//10   a是test函数栈上的别名,a所引用的空间是无效的空间,10为调用函数后栈上存在的"垃圾"被printf函数调用时重新"拾取",之后将修改该空间的值
	printf("%d\n",a);//-2   这次printf函数调用的时候就是上面printf函数修改后的值(随机值)
	printf("%d\n",a);//-2   同第二个printf函数返回值
	return 0;
}

如果需要作为函数的返回值类型,有两种方法:
(1)需要加长栈上变量的生命周期。(将其定为全局变量)

int ret = 10;
int& Test()
{
	//ret是栈上的空间,函数调用之后已经被释放
	return ret;
}

int main()
{
	int& a = Test();
	printf("%d\n", a); //10
	printf("%d\n", a); //10
	printf("%d\n", a); //10
	return 0;
}

(2)传参传引用。

int& Test(int& ret)
{
	//ret是栈上的空间,函数调用之后已经被释放
	return ret;
}

int main()
{
	int b = 10;
	int& a = Test(b);
	printf("%d\n", a); //10
	printf("%d\n", a); //10
	printf("%d\n", a); //10
}

五、引用和指针:
共同点:引用和指针在作为参数以及返回值类型上效率几乎相同。
区别:
1.引用在定义是必须初始化,指针不做要求;
2.引用在引用一个实体后,就不能,在引用其他实体,但指针可以在任何时候指向任何一个类型实体;
3.没有NULL引用,但有NULL指针;
4.sizeof中含义不同,引用结果是引用类型的大小,但指针始终是地址空间所占字节个数。(32位平台是4,64位平台是8)
5.引用自加是给实体加1,指针自加时向后偏移类型字节大小。
6.有多级指针,但没有多级引用。
7.访问实体方式不同,指针需要解引用,引用编译器自己处理。
8.引用比指针更安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值