[C++]指標和引用(三)

丫就是熊個貓貓發表於2016-12-05

引用

對變數起另外一個名字 (外號),這個名字稱為該變數的引用。

<型別>   &<引用變數名> = <原變數名>;

其中原變數名必須是一個已定義過的變數。如:

int   max ;

int  &refmax=max;

refmax並沒有重新在記憶體中開闢單元,只是引用max的單元。max與refmax在記憶體中佔用同一地址,即同一地址兩個名字。

對引用型別的變數,說明以下幾點:

1、引用在定義的時候要初始化。

int  &refmax;           錯誤,沒有具體的引用物件

int  &refmax=max;         max是已定義過的變數

2、對引用的操作就是對被引用的變數的操作。

3、 引用型別變數的初始化值不能是一個常數。

如:int  &ref1 = 5;    // 是錯誤的。

int  &ref=i;

4、引用同變數一樣有地址,可以對其地址進行操作,即將其地址賦給一指標。

5、可以用動態分配的記憶體空間來初始化一個引用變數。

float  &reff = * new float ; //用new開闢一個空間,取一個別名reff

reff= 200;//給空間賦值

cout << reff ;//輸出200

delete &reff;//收回這個空間

這個空間只有別名,但程式可以引用到。

float  *p,  a;

p=new  float;

float  a=* new  float;

指標與引用的區別:

1、指標是通過地址間接訪問某個變數,而引用是通過別名直接訪問某個變數。

2、引用必須初始化,而一旦被初始化後不得再作為其它變數的別名。

當&a的前面有型別符時(如int &a),它必然是對引用的宣告;如果前面無型別符(如cout<<&a),則是取變數的地址。

 

以下的宣告是非法的

1、企圖建立陣列的引用            int & a[9];

2、企圖建立指向引用的指標    int & *p;

3、企圖建立引用的引用            int & &px;

 

對常量(用const宣告)的引用

void main(void)

{

const int &r=8; //說明r為常量,不可賦值

cout<<"r="<<r<<endl;

//r+=15;//r為常量,不可作賦值運算

cout<<"r="<<r<<endl;

}

 

引用與函式

引用的用途主要是用來作函式的引數或函式的返回值。

引用作函式的形參,實際上是在被調函式中對實參變數進行操作。

void  change(int &x,  int &y)//x,y是實參a,b的別名

{   int   t;

     t=x;  x=y;   y=z;

}

void main(void)

{   int  a=3,b=5;

    change(a,b);  //實參為變數

   cout<<a<<‘\t’<<b<<endl;

}  

引用作為形參,實參是變數而不是地址,這與指標變數作形參不一樣。

 

函式的返回值為引用型別

可以把函式定義為引用型別,這時函式的返回值即為某一變數的引用(別名),因此,它相當於返回了一個變數,所以可對其返回值進行賦值操作。這一點類同於函式的返回值為指標型別 。

一個函式返回引用型別,必須返回某個型別的變數。

語句:getdata()=8;

就相當於  int  &temp=8;

                   temp=8 ;  

注意:由於函式呼叫返回的引用型別是在函式執行結束後產生的,所以函式不能返回自動變數和形參。

返回的變數的引用,這個變數必須是全域性變數或靜態區域性變數,即儲存在靜態區中的變數。

 

我們都知道,函式作為一種程式實體,它有名字、型別、地址和儲存空間,一般說來函式不能作為左值(即函式不能放在賦值號左邊)。但如果將函式定義為返回引用型別,因為返回的是一個變數的別名,就可以將函式放在左邊,即給這個變數賦值。

 

 

const型別變數

當用const限制說明識別符號時,表示所說明的資料型別為常量型別。可分為const型常量和const型指標。

可用const限制定義識別符號量,如:

const  int MaxLine =1000;

const  float  Pi=3.1415926

用const定義的識別符號常量時,一定要對其初始化。在說明時進行初始化是對這種常量置值的唯一方法 ,不能用賦值運算子對這種常量進行賦值。如:

MaxLine =35;

const 型指標

1)禁寫指標

宣告語句格式為:     資料型別    *  const   指標變數名

如:int  r=6;

    int * const  pr=&r;

則指標pr被禁寫,即pr將始終指向一個地址,成為一個指標常量。它將不能再作為左值而放在賦值號的左邊。(舉例說明)

雖然指標被禁寫,但其間接引用並沒有被禁寫。即可以通過pr對r賦值。*pr=8;

2)禁寫間接引用

宣告語句格式如下:

             const  資料型別   *指標變數名;

所宣告的指標指向一禁寫的實體,即間接引用不能被改寫。如:  const  int  *p;

所以程式中不能出現諸如  *p=  的語句,但指標p並未被禁寫,因而可對指標p進行改寫。

3)禁寫指標又禁寫間接引用

將上面兩種情況結合起來,宣告語句為下面的格式

const   資料型別    *const     指標變數名

如:const  int  *const  px=&x

說明:px是一個指標常量,它指向一禁寫的實體,並且指標本身也被禁寫,諸如:px=      *px=    此類的語句都是非法的。

在定義時必須賦初值。

 

相關文章