zoukankan      html  css  js  c++  java
  • &(引用) 和 *(指针)

    引用:

    引用相当于给引用的对象起一个别名,对引用的操作即是对原对象的操作。

    使用方式:

    int cnt = 1024;

    int &x = cnt;

    一般情况下引用的类型要和被引用对象一致(例外是常量引用可以和对应的非常量对象绑定)。

    一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象绑定在一起。因而无法令引用重新绑定到另外一个对象,因此引用必须初始化。

    引用并非对象,它只是为一个已经存在的对象起另外一个名字。

    定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的:

    int cnt = 1024;

    int &x = cnt;

    x = -1;//给引用x赋值为-1,即给cnt赋值-1,所以此时cnt的值为-1

    因为引用不是对象,所以不能定义引用的引用(引用就是给一个对象起个别名,反之若一个变量不是对象,则起不能有引用)。

    非常量引用不能与字面值绑定在一起

    1 int &x = 1024;//错误用法
    2 
    3 const int &x = 1024;//正确用法

    指针:

    指针是指向另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。不过指针与引用又有很多不同点。其一,指针本身也是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。其二:指针无需在定义时赋初值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。

    使用方式:

    int cnt = 1024;

    int *x = &cnt;

    指针存放的是对象的地址,要获取该地址需要用取地址符(&)。

    一般情况下声明指针的类型需要和其指向的对象类型一致(例外是常量指针可以指向一个对应的非常量对象)。

    指针的值(即地址)应属于下列4种状态之一:

    1.指向一个对象;

    2.指向紧邻对象所占空间的下一个位置(如vector的end指针);

    3.空指针,意味着指针没有指向任何对象;

    4无效指针,也就是上述情况之外的其他值。

    可以用解引用符获得指针的对象,但只能对指向某个对象的有效指针解引用。

    空指针

    空指针不指向任何对象,在试图使用一个指针之前应该先检查该指针是否为空。

    声明一个空指针的方法:

    1 int *p1 = 0;
    2 
    3 int *p2 = nullptr; //等价于int *p2 = 0;
    4 
    5 //使用nullptr需先引用头文件cstdlib 且使用c++11编译环境
    6 
    7 int *p3 = NULL;

    在c++11标准下应尽量使用nullptr给指针赋初值。

    不能使用 int 类型给 int * 类型赋值,即便 int 变量恰好等于 0 也不行。

    如:

     1 int cnt = 0;
     2 
     3 int *p = cnt;
     4 
     5 //不能通过编译。
     6 
     7 
     8 const int cnt = 0;
     9 
    10 int *p = cnt;
    11 
    12 //在c++11之前能通过编译的,不过 c++11标准之后就不行了。

    void * 指针

    void * 是一种特殊类型的指针,可用于存放任意对象的地址。一个void*指针存放着一个地址,这一点和其它指针类似。不同的是并不能确定该指针中对象的类型。

    如:

    1 int cnt1 = 1024;
    2 
    3 int cnt2 = 3.14;
    4 
    5 int *p;
    6 
    7 p = &cnt1;
    8 
    9 p = &cnt2;

    是可以通过编译的。不过void*可以做的事比较有限:拿它和别的指针比较,作为函数的输入或输出,或者赋给另一个void*指针。不能直接操作void*指针的对象(不能将其赋值给void*外的其他类型指针,不能通过cout输出其所指对象等等)。

    指向指针的引用:

    引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:

    1 int cnt = 1024;
    2 int *p = nullptr;
    3 int *&r = p;//r是一个对指针p的引用
    4 
    5 r = &cnt;//r引用了指针p, 赋值&cnt给r即赋值&cnt给p
    6 cout << (*r) << " " << (*p) << endl;//输出1024 1024
    7 *r = 0;//解引用r得到0,即p指向的对象的值改为0
    8 cout << (*r) << " " << (*p) << endl;//输出0 0

     面对一条比较复杂的指针或引用声明语句时,要理解其类型到底是什么,最简单的办法是从右往左阅读其定义。离变量最近的符号(此列中*&r是&符号)对变量有最直接的影响,因此r是一个引用。声明符的其他部分用以确定r引用的类型是声明,此列中的符号*说明r引用的是一个指针,最后,声明的基本数据类型部分指出r引用的是一个int指针。

  • 相关阅读:
    阿里云标准-Docker安全基线检查
    阿里云标准-Redis安全基线检查
    阿里云标准-Nginx安全基线检查
    python中urllib.request和requests的使用和区别
    python爬百度首页
    进行base64编码
    python基础入门 文件操作
    python面向对象编程: 搬家具案例
    在vi或vim上查找字符串
    浅析数据一致性
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/7896249.html
Copyright © 2011-2022 走看看