C 指標型別間強制轉換

2022-04-27 13:56:11 字數 1820 閱讀 6159

深入理解指標型別間的轉換

c++中指標的強制轉換

強制型別轉換(int)、(int&)和(int*)的區別

記憶體中的位址

位址的本質就是一串0和1的機器**,記憶體中的位址沒有明確資料型別,但位址值有型別,以32位編譯器為例,記憶體中的位址是乙個32位的整數。無論什麼型別的指標變數,在記憶體中本質上都是一樣的,都是乙個整數值的位址值,該位址值可以轉換為其他型別,比如float或char,但一般不要強轉,此時已不再是合法位址而是乙個單純的資料值,除了沒有意義外,還會出現資料讀取錯誤(後面會解釋)。

int a;

當我們用a時,由於前面把a定義為int型,則編譯器知道從a的位址開始向後取4個位元組再把它解釋成int型。

指標變數及不同指標型別的含義

(1)指標變數

1int *a;

指標變數,本質上是乙個變數,只是它是存放位址的變數,指標的型別代表的是它所指向的變數的型別。因此就有了指向整型、字元型、浮點型等其它型別的指標,但實際上所有型別的指標變數存放的都是int型。

上述**表示指向整型的指標變數a,其中a表示乙個位址值,上面曾提到位址沒有明確的資料型別,因為位址可以為指向整型的指標,可以為指向浮點型的指標。指標型別為整型,表示當我們對該位址進行訪問(解引用)時,編譯器會將它解釋為整型。

(2)不同型別的指標

宣告不同型別的指標變數既是規定了該變數結合指標運算子時讀取記憶體中的位元組數,同樣規定了在指標移動和指標的運算時(加、減)在記憶體中移動的最小位元組數。

強制轉換的原理

(1)普通變數強轉

(float)a,就是先按照int型別取出該數值,再將該數值按照int to float的規則轉換成float型,如果反過來,則會發生資料截斷。

(2)指標變數強轉

舊指標 to 新指標的強制型別轉換是指將指標所指的內容的型別由原先的型別轉換為後面的型別:即進行變數解釋的時候,解釋的型別變化。

如果有乙個指標p,我們需要把它的型別和所指向的型別改為tyep*和type,那麼語法格式是:(type*)p;這樣強制型別轉換的結果是乙個新指標,該新指標的型別是type*,它指向的型別是type,(也就是說,新指標指向的資料將會用type型別進行解釋,如果之前是浮點型資料-3.75,先將其轉換為二進位制**,然後轉化為type型別儲存),它指向的位址就是原指標指向的位址。

注意:(int &)y,告訴編譯器將y當做int看待

1

void

test02()

(3)為什麼記憶體中的位址值不能直接轉換為float?

(4)位址值強轉後訪問的資料錯誤

前面提到可以將位址值轉為float或char,此時位址值變成了資料(有可能無法解釋為char資料),而非合法位址。在對該位址進行訪問時,需要將該位址值重新變為合法位址,通過(int*)強轉,但浮點型資料不允許作為位址值。

(5)字元強轉為合法位址

1

void

test04()

特別注意:char*型別不能直接由cout輸出對應位址,cout會直接輸出指向的字串,可以用static_cast(&m)來進行位址輸出。

指標強制型別轉換

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

指標型別強制轉換

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

C語言指標強制型別轉換

一 舉例說明 上圖對應函式呼叫為int printf const char fmt,fmt為char 指標型別,所以共佔了32位位元組,但是 fmt執行的是乙個位元組,fmt 執行的是下乙個位元組,fmt得到乙個32位位址,char fmt得到是乙個執行位元組的指標,char fmt 4後正好執行了...