引用与指针

前言      

       暂时告别了C语言中令人头痛的指针,在C++中的引用与C中的指针很类似,但是二者存在着差别。

       引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名。

        举个例子来讲吧,假如有个叫张三的同学,在C语言中,张三这个名字就是指针,而张三这个名字指向了那个同学,换句话来说,张三这个名字是个地址,而这个地址指向了叫张三的同学这个实体内容;而在C++中的引用则不同,张三这个名字,也是指向了这个名字叫做张三的同学,那么在外面这个同学叫张三,回到家里父母、朋友可以叫他的小名或者别名 “ 三三 ”,二者指向了同一个实体(叫的是同一个人),所以我们需要叫这个同学的话,我们可以用“张三”也可以用“三三”,因为他们指向的是同一个人(同一个实体)。

 我们可以用一个小程序来检测:

#include<iostream>
using namespace std;

int main()
{
	int a = 2;
	int& b = a;
	cout<<&a<<endl;
	cout<<&b<<endl;
}

       说到这里,我们可以总结下引用的特点,特点具体如下:

       1.一个变量可以取多个别名;

       2.引用必须初始化;

       3.引用只能在初始化的时候引用一次,不能改变为再引用其他变量。

      ps:const引用

      不能给一个const修饰的变量进行引用。    

引用的类型转换    

 再看一个代码:

int main()
{
	double d = 3.14;
	int& a = d;
}
 

结果提示“无法从double转换为int&”,是不是因为a和d的类型不同呢?

其实并不如此,

首先,double转换成int 时,将3.14的值先保存到一个临时空间中(_d),之后&a再指向该临时空间,但是防止对临时空间进行修改,前面应该加上const,

eg:const int& a = d

;

在我们添加了const之后,可以看到只是警告"从double转换到int可能丢失数据”


引用在函数作为返回值

#include<iostream>
using namespace std;
int& Add(int d1,int d2)
{
	int ret = d1 + d2;
	return ret;
}
void test()
{
	int a = 3,b = 4;
	int c = Add(a,b);
	cout<<"c:"<<c<<endl;
}
结果在生成期间编译器提示“ 返回局部变量或者临时变量地址”,这个类似可以理解成返回一个指针,在 函数的调用期间开辟了一块临时空间用于保存临时变量ret,但是在调用结束之后,这块内存释放,但是ret的地址却被作为返回值返回,和野指针一样,已经指向了位置内容的地址。

通过上面代码可以得出一些结论:

     1.不要返回一个临时变量的引用,它最后可能成为了一个“野指针”;

     2.如果返回对象出了当前函数作用域依旧存在,那么我们可以使用引用作为返回值,因为这样更高效(引用返回地址,值返回变量本身)。


总结

在最后,总结一下引用和指针之间的区别:

  1.引用只能在定义时初始一次,之后不能改变指向其他变量,而指针变量值可变;

  2.引用必须指向有效的变量,而指针可以为空(NULL);

  3.sizeof指针对象和引用对象意义不同,sizeof引用:指向的变量的大小;

                                                           sizeof指针:地址大小;

  4.指针的自增和自减与引用不同;

  5.引用比指针更安全。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值