1. 程式人生 > >C/C++【初級】之一 指標(*)、取地址(&)、解引用(*)與引用(&)的概念

C/C++【初級】之一 指標(*)、取地址(&)、解引用(*)與引用(&)的概念

1.引用注意事項:

1.引用必須被初始化;
2.引用一旦與初始值物件繫結,就不會變化(引用從一而終)!!!
3.引用初始值必須為一個物件,不能使常數
4.引用必須與被引用的物件型別一致

示例1:

    /*——————————————————————————————
    示例01:關於 & 引用 
    ——————————————————————————————*/ 
    int val = 100;
    int &refval1 = val;             // &refval是引用,以i為別名 
    int &refval2 = refval1;         // refval2與refval共同繫結在val上 
//int &refval3; // error:引用必須初始化 //int &refval4 = 10 // error :引用的初始值必須為一個物件 //double dval = 3.14; //int &refval5 = dval; // error:引用必須與要引用的物件型別一致,應為int cout << "示例1:\n"; cout << "val: " << val << endl; cout
<< "refval1 = :" << refval1 << endl; cout << "&refval1 = :" << &refval1 << endl; cout << "refval2 = :" << refval2 << endl; cout << "&refval2 = :" << &refval2 << endl; cout << "\n"; refval2 = 10
; // 給引用物件重新賦值 ,相當於給【val = 10】 賦值 cout << "val: " << val << endl; cout << "refval1 = :" << refval1 << endl; cout << "&refval1 = :" << &refval1 << endl; cout << "refval2 = :" << refval2 << endl; cout << "&refval2 = :" << &refval2 <<endl; cout << "\n"; cout << "refval1、refval2 都是引用的val的值,所以他們的地址相同" << endl; cout << "\n"; }

2.定義個簡單的指標

指標注意事項:
1.避免宣告一個指向NULL的指標;

string *ps; // 未初始化的指標 // 合法但危險 

示例2:

    /*——————————————————————————————
    示例02:關於  指標(*)
    ——————————————————————————————*/ 
    int val2 = 100;
    int *ptr2 = &val2; // *ptr定義了一個int型的指標,指向了val所在的記憶體地址 

    cout <<  "示例2:\n"; 
    printf("val2指標所在地址 16進位制:%x",ptr2) ;
  cout <<  "\n"; 

3.指標(*)、取地址(&)、解引用(*)與引用(&)的概念

示例3:

    /*——————————————————————————————
        示例03:關於  指標(*)、取地址(&)、解引用(*)與引用(&)的概念
    ——————————————————————————————*/ 

    int val3 = 100; 
    int &value3 = val3;   // 定義一個【引用】 
    int *ptr3 = &val3;   // 定義一個【指標】 

    int *&refp3 = ptr3;    //將一個【指標引用】和一個指標繫結起來,那麼refp就是一個【指標引用 】 

    cout <<  "示例3:\n"; 
    cout << "val3 的值:                        " << val3 << endl;
    cout << "value3 的值:                      " << value3 << endl;

    cout << "val3所指向的記憶體地址       &val3 : " << &val3 << endl;  // 【取地址】 
    cout << "指標ptr3所指向的記憶體地址   ptr3  : " << ptr3 << endl;       // 
    cout << "對*ptr3指向的內容的取地址  &*ptr3: " << &*ptr3 << endl;  // 【注意:ptr3 = &val3 = &*ptr3 】 

    cout << "獲取指標ptr3指向地址的內容 *ptr3 : " << *ptr3 << endl;   // 【解引用】 
    cout << "獲取指標ptr3的地址         &ptr3 : " << &ptr3 << endl;
    cout << "\n" ;

    cout << "獲取指標引用refp3 的地址   refp3 : "<< refp3 << endl;   // 【指標引用refp】同樣指向 
    cout << "\n" ;

    cout << " (&)取地址 和 (*)解引用* 互為反向操作因此,可以推理出,&*&*ptr依舊還是val的地址:\n" << &*&*ptr3 << endl; 

重點:作用在引用上的所有操作事實上都是作用在該引用所繫結的物件上。

使用引用有何優點?

  在傳參的時候,使用指標傳參,編譯器需要給指標另行分配儲存單元,儲存一個該指標的副本,在函式中對這個副本進行操作;而使用引用傳參,編譯器就不需要分配儲存空間和儲存副本了,函式將直接對實參進行操作。所以使用引用使得程式的執行速度更快,執行效率更高。