c 和 c++ 的指標強制轉換時不太一樣的, c++ 提供了4中型別,用於更加精細化控制指標的強制轉換。
1、指標轉換原理
討論指標的強制轉換之前,我們先要理解清楚指標的根本含義。最通俗的解釋,指標即是位址,但是,指標絕不僅僅只是位址。
1)指標存著所指物件位址
2)指標存著所指物件的型別和型別大小
試想我們定義乙個某型別指標p,後可以p++,p--,*p這些都與「指標記錄了所指物件型別大小」有關,不然p++和p-- 一次跳了多遠?還有*p一次取了多長,都是由記錄的型別大小決定的:如int *p=&i;那麼++ 一次至少會跳int那麼遠即4個位元組(連續儲存下),*p一次也會從p所指向位址為起點取出int那麼長(4位元組)空間的二進位制資訊,並將這些二進位制翻譯成「指標內部存著的其所指向的型別」的型別。
初始化指標就是:
(1)記下所指物件的位址
(2)同時記下所指型別和型別大小。
(3)對乙個指標解引用(*p)就是從指標所指位址為起點,讀出所指型別大小那麼大的空間的二進位制,然後將二進位制翻譯成所指型別
。
(4)而++,——操作就是向前或向後跳所指型別那麼大小的空間
。看下面例項:
#include using namespace std;
int main()
小端模式下:(注意此**不具有移植性,應該避免此類**)
output: 65
p儲存的型別原本應該是t的型別int,然而由於(char*)的出現p中儲存的型別將變成char型別,大小也為char那麼大即乙個位元組,而後+1,這時這一跳將因為目前物件是char型別,而只跳乙個位元組(8位)
綜合:只要指標間在「能轉換的情況下」我們就可以轉來轉去,只要保證不對指標進行移位就可以保證指標所指向位址一直不變
,轉換僅僅轉的是裡面存的型別和型別大小
2、c++ 指標強制轉換 1)
reinterpret_cast型別轉換函式將乙個型別的指標轉換成另乙個型別的指標。這種轉換不用於修改指標變數值資料存放的格式(不改變指標變數值),只需在編譯期間重新解釋指標的型別就可以做到。
2)const_cast用於去除指標變數的常量屬性,將它轉換為乙個對應指標型別的普通變數,反過來,也可以將乙個非常量的指標變數轉換為常量指標變數。這種轉換是在編譯期間作出的型別更改。
3)stactic_cast主要用於基本型別之間和具有繼承關係的型別之間的轉換,這種轉換一般會改變變數的內部表示方式,因此static_cast用於指標的轉換沒有太大的意義。即使允許指標型別的轉換,也不及reinterprret轉換的效率高。
4)dynamic_cast(在執行期間實現轉換,並可以返回轉換成功與否的標誌)
指標強制轉換
指標強制轉換在指令變數賦值上,只是編譯器的乙個善意的提醒,在組合語言中,和不加強制轉換的指令時一樣的,並沒有多產生指令。強制轉換後的影響不是在轉換的時候發生,而是在用轉換後的身份去訪問記憶體時體現到了指令中。例子 6 int i globle variable 7 int pi globle var...
指標的強制轉換
前面曾經講過,如果指標變數指向的變數型別相同,兩個指標變數可以互相賦值。如果指向的變數型別不同,可以先對指標進行型別強制轉換。下面用乙個具體的例子說明 main 程式執行的結果為 pl aaaabbbb pn bbbb pn aaaa 如圖所示,long型變數num在記憶體占用4個位元組,假設首位址...
指標強制型別轉換
當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十四 1。float f 12.3 2。float fptr f 3。int...