引用和指標

2021-08-09 16:42:15 字數 3199 閱讀 1767

引用和指標都屬於復合型別(基於其他型別定義的型別)

1、引用

引用為物件起了另外乙個名字,引用型別引用另外一種型別。通過宣告符寫成&d的形式來定義引用型別,其中d是宣告的變數名:

int  ival  =  1024;

int  &refval  =  ival;                       //  refval指向ival(是ival的另乙個名字)

int  &refval2;                       //  報錯: 引用必須被初始化

一般在初始化變數時,初始值會被拷貝到新建的物件中。然而定義引用時,程式會把引用和它的初始值繫結在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值物件一直繫結在一起。因為無法令引用重新繫結到另乙個物件,因此引用必須初始化。

引用並非物件,相反的,它只是為乙個已經存在的物件起的另外乙個名字。為引用賦值,實際上是把值賦給了與引用繫結的物件。獲取引用的值,實際上是獲取了與引用繫結的物件的值。同理,以引用作為初始值,實際上是以與引用繫結的物件作為初始值。因為引用本身不是乙個物件,所以不能定義引用的引用。

引用的型別必須與其所引用物件的型別一致:

double  dval  =  3.14;

int  &refval  =  dval;              //  錯誤:此處引用型別的初始值必須是int型物件

const 的引用

可以把引用繫結到const物件上,就像繫結到其他物件上一樣,我們稱之為對常量的引用。與普通引用不同的是,對常量的引用不能被用作修改它所繫結的物件:

const  int  ci  =  1024;

const  int  &r1  ci;             //  正確:引用及其對應的物件都是常量

r1  =  42;                    //  錯誤:r1是對常量的引用

int  &r2  =  ci;                     //   錯誤: 試圖讓乙個非常量引用指向乙個常量物件

前面提到:引用的型別必須與其所引用物件的型別一致,但有例外:

double  dval  =  3.14;

const  int  &ri  =  double;

此處ri引用了乙個int型函式。對ri的操作應該是整數運算,但dval卻是乙個雙精度浮點數而非整數。因此為了確保ri幫頂乙個整數,編譯器把上述**變成如下形式:

const  int  tmp  =  dval;        //  由雙精度浮點數生成乙個臨時的整型常量

const  int  &ri  =  tmp;    //  讓ri繫結這個臨時量

2、指標

指標是指向另一種型別的復合型別。與引用類似,指標也實現了對其他物件的間接訪問。然而指標與引用相比又有很多不同點。其一,指標本身就是乙個物件,允許對指標賦值和拷貝,而且在指標的生命週期內它可以指向幾個不同的物件。其二,指標無需在定義是賦初值。和其他內建型別一樣,在塊作用域內定義的指標如果沒有被初始化,也將擁有乙個不確定的值。

定義指標型別的方法將宣告符寫成*d的形式,其中d是變數名:

int  *ip;                           //  指向int型物件的指標

double  *dp;                   //指向double型物件的指標

在宣告語句中指標的型別實際上被用於指定它所指向物件的型別,所以二者必須匹配。如果指標指向了乙個其他的物件,對該物件的操作將發生錯誤:

double  dval;

double  *pd  =  &dval;//  正確:初始值是double型物件的位址

double  *pd2  =  pd;//  正確:初始值是指向double物件的指標

int  *pi  =  pd;         //  錯誤:指標pi的型別與pd的型別不匹配

pi  =  &dval;                 //  錯誤:試圖把double型物件的位址賦給int型指標

指標值

1、指向乙個物件

2、指向緊鄰物件所佔空間的下乙個位置

3、空指標

4、無效指標

指標和const

與引用一樣,也可以令指標指向常量或非常量。類似於常量引用,指向常量的指標不能用於改變其所指物件的值。要想存放常量物件的位址,只能使用指向常量的指標:

const  double  pi  =  3.14;//pi是乙個常量,它的值不能改變

double  *ptr  =  π        //錯誤:ptr是乙個普通的指標

const  double  *cptr  =  π        //正確:cptr可以指向乙個雙精度常量

*cptr  =  42;                         //錯誤:不能給*cptr賦值

前面提到:指標的型別必須與其所指物件的型別一致,但有例外:

double  dval  =  3.14;       //dval是乙個雙精度浮點數,它的值可以改變

cptr  =  &dval;                        //正確:但是不能通過cptr改變它的值

允許令乙個指向常量的指標指向乙個非常量的物件。

最後總結一下:所謂的指向常量的指標和引用,不過是指標或引用」自以為是」罷了,它們覺得自己指向了常量,所以自覺地不去改變所指物件的值。

重點:

★相同點:

●都是位址的概念;

指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用是乙個可以指向該記憶體並且能自動解引用的  也叫作別名

★不同點:

●指標是乙個實體,而引用僅是個別名;

●引用只能在定義時被初始化一次,之後不可變;指標可變;引用「從一而終」,指標可以「見異思遷」;

●引用沒有const,指標有const,const的指標不可變;

●引用不能為空指標可以

●「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;

●指標和引用的自增(++)運算意義不一樣;

●引用是型別安全的,而指標不是 (引用比指標多了型別檢查)

使用時盡量使用引用在傳參的時候,畢竟少了一次拷貝構造;

對於類的引用成員變數在初始化列表中初始化:

指標和引用,const 指標和const 引用

指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...

指標和引用

一 先看一段 include using namespace std void freeptr1 int p1 void freeptr2 int p2 void main 思考 在 freeptr1 和freeptr2 的比較中,你能發現它們的不同點嗎?二 對 進行解釋 include using...

指標和引用

指標與引用看上去完全不同 指標用操作符 和 引用使用操作符 但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用引用呢?首先,要認識到在任何情況下都不能使用指向空值的引用。乙個引用必須總是指向某些物件。因此如果你使用乙個變數並讓它指向乙個物件,但...