引用即繫結到另乙個物件上,因此定義了乙個引用,對其操作即是對與之繫結的物件進行操作(如為引用賦值,獲取引用的值,以引用作為初始值...)。
與引用類似,實現對物件的間接訪問。
指標和引用的本質區別:
引用不是物件,指標本身即是物件。指標和引用的共同:
都需要型別和物件型別嚴格匹配(不支援型別轉換),並且指標只能指向變數/物件,不能指向字面值或者表示式。同時,也都對常量指標和常量引用出現例外情況,即這兩種情況下可以使用一般的初始化。指標值(前三種有效):
注意:1、試圖拷貝或者以其他形式訪問乙個無效指標將引發錯誤,訪問無效指標的後果無法預計,並且編譯器不檢查此類錯誤,在設計程式時,必須清楚所有指標的有效性;
2、第2和3種指標雖然有效,但並不指向任何具體物件,因此訪問此類指標的物件也不允許。
因此:建議初始化所有指標,並且盡量在定義了物件之後,再定義物件的指標。如若不清楚指標的指向,可以暫時初始化為nullptr或0 ,此時編譯器即可以知道所有指標的指向。
指標作為條件判斷:
前提:指標有效。
如if(p)... 空指標,條件為0;其他有效指標,條件為1 。
如if(*p)... 表示指標指向的物件作為條件判斷。
const只是個限定符,限定了不能改變其值,此限定只在要改變const變數的值時才起作用。
定義並初始化乙個const變數,則編譯器會在整個檔案中將所有用到const物件替換成其初始值。
const int ci=2017;
const int &ri=ci;
引用中的一種例外:
注釋:對常量的引用可以普通初始化,可以繫結非常量,但常量物件必須用對常量的引用繫結(但常量物件可以賦值給常量或變數物件)。
指標中的一種例外:
注釋:指向常量的指標 可以指向非常量(普通初始化
),但要存放常量的位址必須使用 指向常量的指標。
指標和引用對於const的區別:常量指標(也是普通型別限定)
(1)指標是物件,引用不是物件,因此允許把指標定義為常量,即常量指標。
變數位址儲存為常量指標 int errnumb=0; int *const curerr=&errnumb;
常量位址儲存為指向常量的常量指標 const double pi=3.14; const double *const pip =π
(2)引用和指標操作不同,引用相當於繫結物件的別名(對物件的直接訪問),指標是存放物件的位址(解引用,為間接訪問)。
注釋:對const的引用和指向常量的指標都是對引用和指標的限定,不能通過引用或指標方式改變物件的值。
而常量指標,const限定的是變數型別,和前邊的const限定符一樣,即不能改變變數的值,在常量指標下,即是不能改變指標的指向。
實際上是對 非常量引用、非常量指標、普通型別限定(包括常量指標)、對const的引用、指向const的指標 初始化和賦值的總結。
但是對於引用和指標的使用,不通過繫結或指標改變物件的值,因此可以進行普通賦值和解引用操作 或 其他改變物件值的操作。(如 const int & ci=i1; int i2=ci; 此處是使用引用操作,而不是繫結常量物件)
物件拷貝操作時,頂層和底層const區別比較大:
const, 引用與指標
const int bufsize 512 對const的引用 簡稱為 常量引用 const int ci 1024 常量 const int r1 ci 對常量的引用 常量引用,不允許通過r1修改ci不能通過引用來改變它所繫結的值 double dval 3.14 const double rd ...
const與指標 引用
定義乙個指標 p const int p null intconst p null int const p null 上面兩行定義完全等價,第三行則不同。下面兩行定義也完全等價 const int const p null intconst const p null 舉例說明 int x 3 con...
const 引用與指標
希望這是最後一次修頂這篇essay了,之前寫的兩次都有些小毛病。打臉,又來更新了。ps 右值指的是字面常量和表示式求值過程中建立的臨時變數。我們忽略掉了相同型別是否可以賦值的情況 我到現在的學習裡都還可以相互賦值 以及型別相容的情況。只考慮const 等修飾符帶來的影響 型別相容 const 底層c...