關於指標強制型別轉換的思考

2021-05-28 14:50:41 字數 1147 閱讀 2334

說不上是思考,只是想談談自己對指標的強制型別轉換的理解。之所以寫出來,一方面是自己做乙個筆記,另一方面也可以和大家****,更重要的也是向大家學習。以前總是記不住指標的強制型別轉換的格式,歸根結底還是自己對這個知識點不夠理解。

什麼是指標變數

指標變數,本質上是乙個變數,只是它是存放位址的變數,指標的型別代表的是它所指向的變數的型別。因此就有了指向整型、字元型、浮點型等其它型別的指標,但實際上所有型別的指標變數存放的都是int型(對於16位編譯系統,比如tc,int是2位元組,對於32位編譯系統,比如vc,gcc,int是4位元組)的位址。因此從本質上不同型別的指標變數並沒有區別(因為指標變數的型別為int型,因此指標變數只能存放位址。注意和指標指向物件的型別區分開),指標變數所儲存的位址為指標所指向的物件的首位址。

#include int main()

輸出結果:

不同型別的指標變數之間的區別

我們都知道不同型別的指標變數指向不同型別的物件,這些指標變數結合指標運算子(*)就等價於指向的物件的值,但我們又知道所有的指標變數的型別都是一樣的(都是int型)。到底宣告不同型別的指標變數的背後是什麼?其實宣告不同型別的指標變數既是規定了該變數結合指標運算子時讀取記憶體中的位元組數,同樣在指標移動和指標的運算時(加、減)在記憶體中移動的最小位元組數。

指標變數強制型別轉換轉換的背後

首先看個例子

#include int main()

輸出結果:

由於 pchr ,pint是不同型別的指標變數,因此在pchr = (char *)pint;語句中需要進行強制型別轉換轉換。其實在此可以不理解成指標的強制型別轉換(因為pint還是指向int型的指標,自身並沒有任何改變),暫時可以將pint 理解成儲存a變數的首位址的指標變數,這樣就和pchr = (char *)0x0012ff3c語句等價,但由於pchr的宣告為字元型的指標變數,因此等號的另一端應是乙個字元型的位址,所以就將&a 宣告(強制轉化)為字元型的位址。但實際上位址本身就是位址,沒有什麼字元型、整型等區別的,只是為了方便說明,從理論上說的通,就認為是字元型的吧 (個人是這樣理解的)。

以上內容僅是個人理解,不嚴謹也沒經過認真思考,不對之處請大家指正。所涉及的語句,僅僅是個人對該知識點記憶方法。

指標強制型別轉換

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

指標型別強制轉換

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

關於強制型別轉換

var dump 0 null false var dump 0 0 true var dump 0 false var dump 0 false true var dump 0 null true var dump 0 0 true var dump 0 true var dump 0 false...