指標和引用中一些要注意的問題

2021-09-08 10:23:04 字數 3048 閱讀 4049

引用

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

int ival=1024;

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

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

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

引用即別名

引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。

定義乙個引用之後,對其進行的所有操作都是在與之繫結的物件上進行的:

refval=2;//把2賦給refval指向的物件,此處即是賦給了ival

int li=refval; //與li=ival執行結果一樣

為引用賦值,實際上是把值賦給了與引用繫結的物件。獲取引用的值,實際上是獲取了與引用繫結的物件的值。同理,以引用作為初始值,實際上是以與引用繫結的物件作為初始值:

//正確:refval3繫結到了那個與refval繫結的物件上,這裡就是繫結到了ival上

int &refval3=refval;

//利用與refval繫結的物件的值初始化變數i

int i=refval;  //正確: i被初始化為ival的值

因為引用本身不是乙個物件,所以不能定義引用的引用。

使用引用要注意的兩點:

1 一般的,引用型別要和與之繫結的物件嚴格匹配。

2 引用只能繫結在物件上,而不能與字面值或某個表示式的計算結果繫結在一起。

指標

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

指標值

1 指向乙個物件

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

3 空指標,意味著指標沒有指向任何物件

4 無效指標,也就是上述情況之外的其他值

利用指標訪問物件

如果指標指向了乙個物件,則允許使用解引用符(操作法*)來訪問該物件。

解引用操作符僅適合用於那些確實指向了某個物件的有效指標。

空指標

空指標不指向任何物件,在試圖使用乙個指標之前**可以首先檢查他是否為空。以下列出幾個生成空指標的方法:

int *p1=nullptr;   //等價於int *p1=0;

int *p2=0;    //直接將p2初始化為字面常量0

//需要首先#include cstdlib

int *p3=null;  //等價於int *p3=0;

得到空指標最直接的方法就是用字面值nullptr來初始化指標,這是c++11新標準剛剛引入的一種方法。nullptr是一種特殊型別的字面值,它可以被轉換成任意其他的指標型別。另一種方法就如對p2的定義一樣,也可以通過將指標初始化為字面值0來生成空指標。

賦值和指標

指標和引用都能提供對其他物件的間接訪問,然而在具體實現細節上二者有很大不同,其中最重要的一點就是引用本身並非乙個物件。一旦定義了引用,就無法令其再繫結到另外的物件,之後每次使用這個引用都是訪問它最初繫結的那個物件。

指標和它存放的位址之間就沒有這種限制了。和其他任何變數(只要不是引用)一樣,給指標賦值就是令他存放乙個新的位址,從而指向乙個新的物件。

有時候要想搞清楚一條賦值語句到底是改變了指標的值還是改變了指標所指的物件的值不太容易,最好的辦法就是記住賦值永遠改變的是等號左側的物件。當寫出如下語句時,

pi=&ival; //pi的值被改變,現在pi指向了ival

*pi=0;  //ival的值被改變,指標pi並沒有改變

則*pi(也就是指標pi指向的那個物件)發生改變。

指向指標的指標

一般來說,宣告符中修飾符的個數並沒有限制。當有多個修飾符連寫在一起時,按照其邏輯關係詳加解釋即可。以指標為例,指標是記憶體中的物件,像其他物件一樣也有自己的位址,因此允許把指標的位址再存放到另乙個指標當中。

通常*的個數可以區分指標的級別。也就是說,**表示指向指標的指標,***表示指向指標的指標的指標,以此類推:

int ival=1024;

int *pi=&ival;    //pi指向乙個int型的數

int **ppi=π   //ppi指向乙個int型的指標

此處pi是指向int型數的指標,而ppi是指向int型指標的指標。

解引用int型指標會得到乙個int型的數,同樣,解引用指向指標的指標會得到乙個指標。此時為了訪問最原始的那個物件,需要對指標的指標做兩次解引用。

指向指標的引用

引用本身不是乙個物件,因此不能定義指向引用的指標。但指標是物件,所以存在對指標的引用:

int i=42; 

int *p; //p是乙個int型的指標

int *&r=p; //r是乙個對指標p的引用

r=&i;  //r引用了乙個指標,因此給r賦值&i 就是令p指向i

*r=0; //解引用r得到i,也就是p指向的物件,將i的值改為0

要理解r的型別到底是什麼,最簡單的辦法是從右向左閱讀r的定義。離變數名最近的符號(此例中是&r的符號&)對變數的型別有最直接的影響。因此r是乙個引用。宣告符的其餘部分用以確定r引用的型別是什麼,此例中的符號*說明r引用的是乙個指標。最後,宣告的基本資料型別部分指出r引用的是乙個int指標。

面對一條比較複雜的指標或引用的宣告語句時,從右向左閱讀有助於弄清楚它的真實含義。

QT Creator 中一些要注意的地方

5.3 拖放操作 1.執行程式,拖放的時候要拖放到主視窗上,而不是text edit部件上,否則只顯示檔案路徑,而不是檔案內容 2.拖放的時候,會顯示中文亂碼 修改一下讀取檔案的處理函式 void mainwindow dropevent qdropevent event 對於中文顯示亂碼用一行處理...

在web專案中一些需要注意的問題

現在已經做了比較長一段時間的 web專案了,很多人會覺得web專案的技術難度不是很大,我個人感覺這有幾方面的原因,乙個是目前的程式設計師是從事web專案的 包擴.net,php,j2ee 人比較多,而從事其他方面的人員相對要少一些,所以擱行如擱山,大多程式設計師有個很優秀的品質,對於不了解的東西回比...

引用和指標的一些知識

引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。引用即別名 int val 1024 int refval val refval指向val 是val的乙個別名 定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值物...