引用和指针。&什么时候是引用,什么时候取地址,*什么时候指针,什么时候解引用,一篇带你搞懂双重用法

一,引用

为对象起了另一个名字,引用类型引用另外一种类型

    int a = 10;
    int &b = a;      //b指向a(是a的另一个名字)
    int &c;        //错误:引用必须被初始化

一般初始化变量时,初始值会被拷贝到新建的对象中。但是定义引用,只是把引用和他的初始值绑定到一块,并不是拷贝给引用。一旦初始化完成,则和初始值对象一直绑定到一起,无法重新绑定另一个对象

引用即别名

  • 引用并非是对象,他只是为一个已经存在的对象所起的另外一个名字
  • 因为引用并不是一个对象,所以不能定义引用的引用:    即不能这样定义:int& (&d);此时&b不是一个对象

    int a = 10;
    int &b = a;   //b是a的引用
    b = 20;       //此时a的值变为c,引用绑定后,所有操作都是在绑定的对象上进行的
    int d = b;    //以引用作为初始值,实际上是以引用绑定的对象作为初始值

引用的定义

每个开头都必须以&开头

    int a = 10;
    int &b = a;   //b是a的引用
    int &c = b;   //c也是a的引用
    int &aa = 10;   //错误,因为引用类型的初始值必须是一个对象

二,指针

指针本身就是一个对象,可以进行赋值和拷贝;无需在定义时赋初值

    int a, aa;
    int *b = &a;   //b存放a的地址,b是a的指针
    b = &aa;    //可以重新指向
    double *c = &a;      //错误,需要类型相同
    int *d;     //定义时不用赋初值

指针值

  • 指向一个对象
  • 指向紧邻对象所占空间的下一个位置
  • 空指针,意味着指针没有指向任何对象
  • 无效指针,也就是上述情况之外的其他值

如果指针指向了一个对象,则允许使用解引用符(*)来访问该对象

    int a = 10;
    int *b = &a;
    cout << *b << endl;     //使用解引用符号

解引用符号仅适用于哪些确实指向了某个对象的有效指针

空指针

    int *a = 0;
    int *b = NULL;           //需要加#include<cstdlib>头文件
    int *c = nullptr;          //C++11新标准刚引用的一种方法,尽量使用这一种方法

三,关键

&和*符号既能够做表达式,既能作表达式里的运算符,也能作为声明的一部分出现,符号的上下文决定了符号的意义

   int a = 10;
   int &b = a;        //&紧随类型名出现,因此是声明的一部分,b是一个引用
   int *c;            //*紧随类型名出现,因此时声明的一部分,c是一个指针
   c = &a;         //&出现在表达式中,是一个取地址符
   cout << *c << endl;      //解引用符
   *c = a;        //*出现在表达式中,是一个解引用符
   cout << *c << endl;      //解引用符
   int &d = *c;   //&是引用,*是解引用符
   cout << d << endl;         //此时d是*c的别名

int *c;
int &d = *c;    这个地方我的理解是d是*c的别名,不知道对不对,有其它意见可以下面评论

下面再给一个例子帮你理解指针的指向

eg:

int i = 10;
int *pi = 0;      //pi被初始化,但没有被指向任何对象
int *pi2 = *i;      //pi2被初始化,存有i的地址
int *pi3;       //如果pi3定义于块内,则pi3的值是无法确定的

pi3 = pi2;    //pi2和pi3指向同一个对象i
pi2 = 0;      //现在pi2是空指针,不知向任何对象

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大学生毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值