1. 程式人生 > 實用技巧 >C++ Primer 指標,引用筆記

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* 指標