c++ 引用 指针。

 

一、什么是引用(reference) ?已经存在的对象的另外一个名字。

  引用有什么特别的?

    1.引用在定义时,以&开头。

    2.引用不是对象,只能绑定在对象上。所以必须在初始化的时候,指定引用绑定的对象。而且引用绑定是不可以改变的。

      int val = 0;

      int &refVal = val;

      不允许这样初始化 int &refVal; 

    3.就像使用变量名一样,对引用赋值,实际上是给该引用绑定的对象赋值,获取引用的值,也同样是获取与该引用绑定的对象的值。

      int &refVal2 = refVal ;// refVal2绑定到了val上面。

      int copyVal = refVal; // 初始化copeVal为val的值。

 

 

二、什么是指针(pointer)? 存放着某个对象所在地址的对象

  和引用的区别是,指针是对象,可以被更改。不必须初始化,尽管一般会初始化以规避一些问题的出现。

  1.指针在定义时,以*开头。赋值时需要使用取地址符(&)来得到某个对象的地址。在C++中,相同的符号,在不同的情况使用,意义不同,就像不同的符号。

    int val = 0;

    int *p = &val; //p存放val的地址, 即 p是指向val的指针。指针类型一般必须和指向的对象类型完全一致。

  2.如何通过指针来得到指针指向的对象的值,以及改变该对象的值?如何获取指针中的地址?

    可以用解引用符(*)获取指针指向的对象的值,给解引用的指针赋值,就是给被指针指向的变量赋值。

    直接获取指针的值,就是获取指针存放的地址。

    

     

储存常量地址的指针,必须使用指向常量的指针(pointer to const)

const int num =0; 

const int *p = # //底层const

 但是常量指针可以指向非常量的对象。(不变的是指针所存放的地址,而不是指针指向的对象)

double pi = 3.14159;
double *const pd = π//顶层const,不可以修改指针的值
pi = 1.26;//ok。
*pd = 3.14;//ok, 指向非常量对象的指针可以用来修改对象的值

 顶层const和底层const的区别究竟在哪里?

   int num = 3;
    const int *p_i = #  //底层const,不代表它指向的值一定是const.
    num = 2;//ok,*p_i ==2 now
    //*p_i = 1;//wrong ,不可通过底层const指针修改指向的对象的值。
    int num2= 3;
    p_i = &num2;//底层const指针可以重新赋值其他地址。
    int *const p_t = &num2;
    //p_t = #//wrong,read-only 不可以修改顶层指针的地址。
    *p_t = 1;//ok,可以通过顶层指针修改对象的值。
    const int *const p_m = &num2;
    //*p_m = 1;//wrong ,底层+顶层const指针。
    int *p_w;
    p_w = p_t;//ok,顶层指针可以被赋值给普通int指针。
    //p_w = p_i;//wrong ,底层指针不可以被赋值给没有底层const资格的指针

 

posted @ 2020-03-16 11:49  Esther_Cheung  阅读(235)  评论(0编辑  收藏  举报