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