指標 引用 volatile C 型別轉換

2021-08-27 03:55:37 字數 1844 閱讀 8105

指標和引用的定義和性質區別:

(1)指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。

(2)引用在定義的時候必須初始化;

(3)引用不可以為空,當被建立的時候,必須初始化,而指標可以是空值,可以在任何時候被初始化。

(4)指標是乙個實體他在棧中有自己使用的空間,但是引用沒有,」sizeof引用」得到的是變數(物件)的大小,而」sizeof指標」得到的是指標本身的大小;

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

//引用++,改變了這個值本身;

//指標++,改變了指標本身,指標本身儲存的是位址,該指標指向了別處位址,對變數本身沒有影響;

(6)引用和指標作為引數的時候不一樣。指標的開銷更大,所以盡可能的使用引用。

//引用作為引數傳參不用拷貝,直接在原變數上進行操作,形參和實參實際上是同乙個變數,不過形參是實參的別名。

//指標作為引數傳參時需要在函式棧楨內建立乙個形參,形參是利用實參拷貝構造的(系統預設給出的是淺拷貝),形參指向的空間和原指標指向的一致。形參和實參都可以達到改變變數的目的,不過形參和實參兩者是不同的兩個變數。

(7)指標比較靈活複雜一點,容易出錯,所以使用的時候必須謹慎。

1》比如說指標可以指向空,引用不行,所以使用前必須判斷是否為空;

2》指標所指向的位址被釋放了以後,指標卻還指向該記憶體,就會出現「野指標」的問題。

所以釋放了指標所指向的空間之後,最好將指標置空。

3》指標可以隨意加進行++ -- 而不改變變數本身,引用++ -- 會改變變數。

volatile主要是去掉const的某種特性,防止他每次都在暫存器裡面去查詢變數,每次用到變數的時候都是從記憶體位址去尋找然後重新讀取。

const修飾的變數會被編譯器優化,首先去暫存器裡面去呼叫,即使你已經修改了變數本身,他還是會優先去取舊值。

首先非const型別不加volatile就沒有問題了嗎?

並不是,涉及到系統程式設計,如果有諸如:a=0;while(a!);的語句,編譯器檢測迴圈內部並沒有使用變數,所以會優化,當你讀取a的值的時候,就會從暫存器裡面去找,而不是從記憶體單元裡面去找,如果你捕捉了某個訊號handler函式中改變了全域性變數a的值,他也不會發現。

1.有可能會改變的變數,最好加上volatile;

2.只寫不讀,也要加上volatile,肯定不是普通的記憶體,是對映到記憶體位址空間的硬體暫存器,例如串列埠的接收暫存器屬於上述第一種情況,⽽而傳送暫存器屬於上述第二種情況。

第一種情況:因為計算機介面不同,16位,32位,64位是不同的,long long 型別的64一條指令,32兩條,16四條:

第二種情況:因優化而導致不從記憶體訪問;

explicit是避免c++中單引數的類都支援隱式型別的轉換,explicit:防止建構函式的隱式型別轉換。

c1(10);和c2=10。第二個是優化了 它首先是利用10構造了乙個匿名物件,然後將匿名物件拷貝構造賦值給c2,此處編譯器已經優化,所以只能看到一次構造被呼叫。

c++強制型別轉換

static_cast 隱式型別轉換

reinterpret_cast 強制型別轉換

const_cast 取消const的特性

dynamic_cast 他的作用是 將父類指標轉換為子類的指標或引用;

用dynamic_cast會更加安全,因為他可以做到型別檢查,區分父子類指標。

1.dynamic_cast 只能用於含有虛函式的類

2.dynamic_cast 先檢查是否能夠轉換成功,不能返回0;

引用型別和指標

三個整數a,b,c從小到大排序 輸入三個整數a,b,c 按照從小到大次序輸出。1 2 3 1 2 3 6 6 6 1 10 100 include include includeusing namespace std void swap2 int a,int b int main int a,b,c...

VC 引用型別與指標型別

兩種型別的引數都允許有效地向函式傳遞大型類物件 引用必須被初始化為指向乙個物件,一旦初始化了它就不能再指向其他物件。指標可以指向一系列不同的物件,也可以什麼都不指向。因為指標可能指向乙個物件或沒有任何物件,所以函式在確定指標實際指向乙個有效的物件之前,不能安全地解引用dereference 乙個指標...

VC 引用型別與指標型別

兩種型別的引數都允許有效地向函式傳遞大型類物件 引用必須被初始化為指向乙個物件,一旦初始化了它就不能再指向其他物件。指標可以指向一系列不同的物件,也可以什麼都不指向。因為指標可能指向乙個物件或沒有任何物件,所以函式在確定指標實際指向乙個有效的物件之前,不能安全地解引用dereference 乙個指標...