C++ Primer 指针,引用笔记

  引用:& 

` int ival = 1024;

   int &refVal = ival;

  int &refVal2       // ! 引用必须初始化!而且无法解绑!!!

  int &refVal3  = refVal; // 正确! 这里其实是绑定到ival 上

  int i = refVal ;      // 正确!!这里i 被初始化为ival 的值

`

  但是!引用本身不是一个对象,所以不能定义引用的引用

但是 类型不匹配是不行的!

   int & refVal4 = 10;         // 不行!!!,因为引用必须绑定的是一个对象!!

   double dval = 3.14;

  int & refVa5l =dval;    // 不行!!类型不匹配!

  指针(pointer) 1 指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生活周期内它可以先后指向不同的对象。 2 指针无需在定义时赋初值,(一旦没有初始化,会将拥有一个不确定的值)


       `
        int *ip1 , *ip2;
        
        double dp, *dp2;

        int ival = 42;

        int *p = &ival;     // 指针存放某个地方的地址!获取地址试用&取地址符

// 因为引用不是对象,没有实际地址,所以不能定义指向引用的指针!!!

        ` 
        指针的值(即地址)应该是下列4种状态之一:

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



        `利用指针访问对象:


              如果指针指向了一个对象,则允许使用解引用符(*) 来访问对象
                    
              int ival = 42;
        
              int *p =&ival;   


              count<< *p ;  // 输出42 , p存放着变量ival 的地址,或者说p是指向ival 的指针

              

              *p = 0;
              count<< *p ;   // 为*p 赋值,实际上是为p所指的对象赋值

`

  空指针(null pointer) :

  int *p1 = nullpter;  //等价于int *p1 = 0

  int *p2 = 0;                   // 初始化p2为字面常量

  int *p3 = Null ;  // 等价于int *p3 = 0

   int ival = 1024;

   int *pi = 0;

   int *pi2 = &ival;

  == : 比较的是两个指针的地址,如果为True 有三种情况 : 1 它们都为空 2 都指向同一个对象 3 都指向了同一个对象的下一地址。:

        (特殊情况, 一个指针指向了某对象,同时另外一个指针指向了另外对象的下一地址,此时也有可能出现两个指针相同的情况,即指针相等)


  Void* 指针

       是一种特殊的指针,可以用于存放任意对象的地址,一个*void 指针存放着一个地址,但是与其他不同的是,我们对这个地址到底是什么类型并不了解

        概括来说,我们以void 的视角来看内存空间也就仅仅是内存空间,没办法访问内存空间的对象

        我们更多的是拿它来跟别的指针来比较,所谓函数输入,输出,或者赋值给另外一个void* 指针


  理解复合类型的声明:

 ` int i = 1024 , *p = &i, &r = i; //  i是int类型,p是一个int型指针, r是一个int 型引用`


  * 仅仅是修饰p而已,int* 写在一起,如:int*  p  这个*依然是修饰p 的跟int没什么关系,基本数据类型是 int

   int*   p1, p2;   // p1 是指针, 而p2 是int

  指向指针的指针:

        int ival = 1024;   可通过ival 来访问1024

        int *p = &ival;    // pi指向int 型的数    , 可通过*pi 来访问1024
  
        int **ppi = &pi;  //  ppi指向int 型的指针,可通过**ppi来访问 1024



       指向指针的引用:


              **不能定义指向引用的指针!!!** 因为引用本身不是一个对象


         ```
 int i = 42;

              int *p ;       // p 是一个int 型的指针

              int *&r = p;  // r是一个对指针p 的引用


              r = &i;    // r引用了一个指针,所以等同于令p指向 i

              *r = 0;   // 解引用r ,得到 i ,也就是p指向的对象,将i 的值改为 0 
      从右向左阅读!!!距离最近的符号(此例中 &r 的& )就是说明了r是个引用!其余部分表明r 引用是个int 的指针



   



            
















posted @ 2020-11-13 20:25  UXCcccc  阅读(68)  评论(0)    收藏  举报