引用和指针

1.什么是引用?

引用是已经定义的变量的别名,例如:

int a = 233;
int& b = a;

在这里&是引用标识符,不是取地址。相当于b是a的引用,b并不是一个新的变量,它只是a的一个别名。编译器并不会为b开辟内存空间,b和a共用一块空间。

2.引用的应用

1.引用作为函数参数

单纯的为一个变量起个别名毫无意义,引用的主要用途是作为函数的形参,这样函数将使用原始参数而不是参数在栈空间的副本。
例如我们想在函数内部实现两个数的交换,第一种方式可以传递至,第二种方式可以引用作为形参。

//传地址
void swap(int* pa,int* pb)
{
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}
//传引用
void swap(int& ra,int& rb)
{
    int tmp = ra;
    ra = rb;
    rb = tmp;
}

int main()
{
    int a = 10;
    int b = 20;
    //传地址
    swap(&a,&b);

    //传引用,这种更直观方便,效率也相对高,但是在调用过程中看不出来
    swap(a,b);
}

如果我们不希望函数内部修改参数,则可以用常引用传参,但是不能给参数不是常引用的函数传递常参数,例如:

void fun(const int&){}
void fun2(int &){}
int main()
{
    int a = 0;
    const int b = 0;
    fun(a);
    fun2(b);//错误
    return 0;
}
2.引用作为返回值

从函数中返回一个引用,和返回一个指针是一样的,要注意不能返回不存在的东西,否则会访问错误的内存。例如:

int& fun()
{
    int a = 0;
    return a;//错误,函数返回时函数栈帧销毁,对a访问是非法寻址
}
3.指针引用

如果想通过函数改变指针,必须用二级指针作为函数的参数

void fun(int** p)
{
    p++;
}
int main()
{
    int a = 0;
    int* pa = &a;
    fun(&pa);
}

而对于引用则不用取指针的地址

void fun(int* &p)
{
    p++;//这里指针pa++,而不是变量a++
}
int main()
{
    int a = 0;
    int* pa = &a;
    fun(pa);
}
4.引用和const

当左值为const引用时,如果引用和const类型不匹配,则生成临时变量,如:

double a = 1.11;
const int& b = a;

这样的代码编译器仅报出警告,在这里编译器是这样处理的:由double类型产生一个临时的常整型类型const int t = a,然后把临时变量t赋给b,const int& b = t。

如果是形参和实参不匹配,编译器将会在函数返回时把创建的新的临时变量销毁。(这里指以前版本,新版本直接报错)

尽可能使用const:

  • 使用const避免无意修改数据
  • 使用const可处理const与非const实参
  • 使用const 可使函数正确生成并使用临时变量

3.引用和指针的异同

相同点:对于上面的交换变量的一段代码进行反汇编
这里写图片描述

可以看出,在函数传参时,编译器对指针和引用的处理是完全相同的,它们都是地址的概念。

区别:

  1. 指针是是一个实体指向了内存,而引用仅仅是个别名。
  2. 引用被创建时必须初始化,指针则可以任何时候赋值。
  3. 引用具有专一性,一旦被初始化为指向一个对象,就不能指向其他对象。
  4. 引用不能为NULL,指针可以。
  5. sizeof(引用)为引用类型大小 ,sizeof(指针)为指针本身大小,也就是地址空间的内存大小。
  6. 有多级指针 ,无多级引用。
  7. 指针要手动寻址,引用则由编译器完成。
  8. 引用比指针更安全。
  9. 在自增自减时,引用改变的是变量大小,指针改变的是指针的指向空间。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值