C 指標型別與強制轉換

2021-10-02 03:37:56 字數 2339 閱讀 4098

指標是乙個特殊資料型別,也可以理解為混合資料型別。指標具有資料型別資訊及資料在記憶體空間的位址。

問題分析:c++指標雖然像int型別或是long int型別一樣存放著記憶體位址。但是我們取得的指標位址,不僅僅只有位址值,因為指標型別是一種混合型別。這時我們就需要強制型別轉換。我在qt 5.14版本編譯器環境中,要求必須使用long long int,否則會提示接納變數型別位數不足,不能容納指標位址。這時因為不同的系統,不同的位址容量,所造成的位址長度不同。比如32位系統的位址長度要比64位的位址長度短。

將型別名作為強制型別轉換運算子的做法是c語言的老式做法,c++ 為保持相容而予以保留。但是,最新的編譯器會給出警告。對於有強迫症的人來說是無法忍受的。

c++ 引入了四種功能不同的強制型別轉換運算子以進行強制型別轉換:static_cast、reinterpret_cast、const_cast 和 dynamic_cast。

強制型別轉換是有一定風險的,有的轉換並不一定安全,如把整型數值轉換成指標,把基類指標轉換成派生類指標,把一種函式指標轉換成另一種函式指標,把常量指標轉換成非常量指標等。c++ 引入新的強制型別轉換機制,主要是為了克服c語言強制型別轉換的以下三個缺點:

1) 沒有從形式上體現轉換功能和風險的不同。

例如,將 int 強制轉換成 double 是沒有風險的,而將常量指標轉換成非常量指標,將基類指標轉換成派生類指標都是高風險的,而且後兩者帶來的風險不同(即可能引發不同種類的錯誤),c語言的強制型別轉換形式對這些不同並不加以區分。

2) 將多型基類指標轉換成派生類指標時不檢查安全性,即無法判斷轉換後的指標是否確實指向乙個派生類物件。

3) 難以在程式中尋找到底什麼地方進行了強制型別轉換。

強制型別轉換是引發程式執行時錯誤的乙個原因,因此在程式出錯時,可能就會想到是不是有哪些強制型別轉換出了問題。

如果採用c語言的老式做法,要在程式中找出所有進行了強制型別轉換的地方,顯然是很麻煩的,因為這些轉換沒有統一的格式。

而用 c++ 的方式,則只需要查詢_cast字串就可以了。甚至可以根據錯誤的型別,有針對性地專門查詢某一種強制型別轉換。例如,懷疑乙個錯誤可能是由於使用了 reinterpret_cast 導致的,就可以只查詢reinterpret_cast字串。

c++ 強制型別轉換運算子的用法如下:

static_cast 用於進行比較「自然」和低風險的轉換,如整型和浮點型、字元型之間的互相轉換。另外,如果物件所屬的類過載了強制型別轉換運算子 t(如 t 是 int、int* 或其他型別名),則 static_cast 也能用來進行物件到 t 型別的轉換。

static_cast 不能用於在不同型別的指標之間互相轉換,也不能用於整型和指標之間的互相轉換,當然也不能用於不同型別的引用之間的轉換。因為這些屬於風險比較高的轉換。

reinterpret_cast 用於進行各種不同型別的指標之間、不同型別的引用之間以及指標和能容納指標的整數型別之間的轉換。轉換時,執行的是逐個位元複製的操作。

這種轉換提供了很強的靈活性,但轉換的安全性只能由程式設計師的細心來保證了。例如,程式設計師執意要把乙個 int* 指標、函式指標或其他型別的指標轉換成 string* 型別的指標也是可以的,至於以後用轉換後的指標呼叫 string 類的成員函式引發錯誤,程式設計師也只能自行承擔查詢錯誤的煩瑣工作:(c++ 標準不允許將函式指標轉換成物件指標,但有些編譯器,如 visual studio 2010,則支援這種轉換)。

reinterpret_cast體現了 c++ 語言的設計思想:使用者可以做任何操作,但要為自己的行為負責。

const_cast 運算子僅用於進行去除 const 屬性的轉換,它也是四個強制型別轉換運算子中唯一能夠去除 const 屬性的運算子。

將 const 引用轉換為同型別的非 const 引用,將 const 指標轉換為同型別的非 const 指標時可以使用 const_cast 運算子。

用 reinterpret_cast 可以將多型基類(包含虛函式的基類)的指標強制轉換為派生類的指標,但是這種轉換不檢查安全性,即不檢查轉換後的指標是否確實指向乙個派生類物件。dynamic_cast專門用於將多型基類的指標或引用強制轉換為派生類的指標或引用,而且能夠檢查轉換的安全性。對於不安全的指標轉換,轉換結果返回 null 指標。

dynamic_cast 是通過「執行時型別檢查」來保證安全性的。dynamic_cast 不能用於將非多型基類的指標或引用強制轉換為派生類的指標或引用——這種轉換沒法保證安全性,只好用 reinterpret_cast 來完成。

那該如何判斷該轉換是否安全呢?不存在空引用,因此不能通過返回值來判斷轉換是否安全。c++ 的解決辦法是:dynamic_cast 在進行引用的強制轉換時,如果發現轉換不安全,就會丟擲乙個異常,通過處理異常,就能發現不安全的轉換。

C指標之指標與強制型別轉換

int a 5 printf a d.n a 5 printf a f.n a 乙個很奇葩的數字,一看就知道是亂碼 乙個指標涉及2個變數 int 型別說白了就是指標型別,只要是指標型別就都是佔4位元組,解析方式都是按照位址的方式來解析 意思是裡面存的32個二進位制加起來表示乙個記憶體位址 的。對於指...

指標強制型別轉換

當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十四 1。float f 12.3 2。float fptr f 3。int...

指標型別強制轉換

問題為下 include void main 輸出為啥不是1呢 這個時候,我們可以看到函式式裡面有格式的轉換,如果格式轉換時存在除void格式外,還有兩個及兩個以上的格式的轉換,則這時候的指標所指的variable所佔的記憶體會產生變化,從而會使格式發生相應的變化 對於本題 當你強行將int指標變為...