指针与引用

   引用就像是一个人的小名一样,它可以有多个但终究代表的是一个人。在C++中,变量的引用就是变量的别名。

一.在使用引用的过程中,我们需要注意以下几点:

1.在声明引用时必须立即对它进行初始化;

  int i=10;

  int &j;

  j=i;                 //错误,不能声明完成后再赋值

2.变量类型要相同;

  double a;

  int &b=a;           //错误,变量类型不符

  const int &b=a; //编译可通过,但是从double转换到const int可能会丢失数据 

3.为引用提供的初始值,可以是一个变量或另一个引用;

  int i=0;

  int &j1=i;

  int &j2=j1;           

  这样,j1j2均为变量i的别名

4.引用在初始化后不能被再被重新声明为另一变量的引用;

5.一个变量和它的引用的值是同步更新的,并且共享同一内存单元,所以系统并不为引用另外分配内存空间;

6.指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量;

7.不能建立引用的数组;

  int a[3]={0,1,2};

  int &refa[3]=a;     //错误

8.不能建立引用的引用,不能建立指向引用的指针;

  int m=1;

  int &&refm=m;    //错误

  int &*p=m;       //错误

9.可以将引用的地址赋给一个指针,此时指针指向的是原来的变量;

  int a=10;

  int &b=a;       //ba的引用

  int *p=&b;     //指针变量p指向a的引用b,相当于指向

  

二.引用作为函数参数

1.之前,交换两个数时我们知道传参要传地址.

void Swap(int *left,int *right)
{
	int tmp=0;
	tmp=*left;
	*left=*right;
	*right=tmp;
}


在学习C++后,我们还可以通过一种更高效的方式来实现即引用作为函数参数。

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

那么有疑问就来了,既然这两种都能达到我们想要的效果,那么它们有什么区别呢?

@首先,传址时要为指针变量开辟内存空间,而引用它是实参的别名与其占用同一块内存,不需用单独为其开辟;

@其次呢,传引用效率比传指针效率更高;

@最后呢,传引用更加的直观,方便。


2.当不希望函数内改变参数的值时,尽量使用常引用传参(即引用参数被const修饰)。


引用和指针的区别和联系

1. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。

2. 引用必须指向有效的变量,指针可以为空。

3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。

4. 指针和引用自增(++)自减(--)意义不一样。指针的++是指向下一块空间,而引用的++是在原有值的基础上加1

5. 相对而言,引用比指针更安全。

总之,指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所指的地址释放以后最好置0,否则可能存在野指针的问题。

 

三.使用引用返回函数值

                                 

前者使用传引用返回时是取tmp的地址到eax寄存器中;后者使用传值返回时是将tmp的值放到eax寄存器中。

结论:

1. 不要返回一个临时变量的引用

2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值