指標變數 指標強制型別轉換

2021-06-22 11:21:46 字數 1483 閱讀 4454

一、什麼是指標變數?

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

但實際上所有型別的指標變數存放的都是int型的位址(16位的編譯系統,int是2位元組; 32的編譯系統,int是4位元組)。

本質上,不同型別的指標變數並沒有區別(因為指標變數的型別為int型,因此指標變數只能存放位址),注意要與指標所指向的物件型別區分開來,

指標變數所儲存的位址為指標所指向的物件的首位址。

指標也是乙個變數,它自己佔據乙個4個位元組的位址空間(由於程式的定址空間是2^32次方,即4gb,

所以用4個位元組表示指標就已經能指向任何程式能夠定址到的空間了,所以指標的大小為4位元組)

#include

int main(void)

輸出結果:

pint = 0x0012ff3c

pchr = 0x0012ff33

pflt  = 0x0012ff24

二、不同型別的指標變數有什麼區別?

不同型別的指標變數指向不同型別的物件,這些指標變數結合指標運算子(*)就等價於指向的物件的值,

但我們又知道所有的指標變數的型別都是一樣的(都是

int型)。

到底宣告不同型別的指標變數的背後是什麼?

其實宣告不同型別的指標變數既是規定了該變數結合指標運算子時讀取記憶體中的位元組數,

同樣在指標移動和指標的運算時(加、減)在記憶體中移動的最小位元組數。

三、指標的強制型別轉換

1、舉例說明

上圖對應函式呼叫為int printf(const char *fmt, ...),fmt為char *指標型別,所以共佔了32位位元組,但是*fmt執行的是乙個位元組,*fmt++執行的是下乙個位元組,&fmt得到乙個32位位址,(char *)&fmt得到是乙個執行位元組的指標,(char *)&fmt+4後正好執行了var3,因為fmt占用4個位元組。(int *)((char *)&fmt+4),又將其轉換為執行4個位元組的指標,此時*((int *)((char *)&fmt+4)),那麼取出來的數字變是32位的資料,也就是var3。

總結:強制轉換為char *,那麼指標++後移動乙個位元組,*指標得到乙個位元組。強制轉換為int *,那麼指標++後移動4個位元組。同時*指標得到4個位元組。

無論什麼型別的指標變數,相減後得到的都是相差的個數。

2、什麼時候需要強制型別轉換

[cpp]view plain

copy

#include 

#include 

intmain()    

此時得到的結果為-64,因為*b只指向乙個位元組。

後記:關於指標幾個知識點,綜合網上資料,後續還有指標的內容,待續。。。

Object C 指標變數強制型別轉換

除了id型別外,指標變數只能呼叫它編譯時型別的方法。而不能呼叫它執行時型別的方法,即使它實際所指向的物件包含該方法。如果需要讓這個指標變數呼叫執行時型別的方法,就需要強制型別轉換。import intmain intargc,const char argv return0 2014 11 29 15...

Object C 指標變數強制型別轉換

除了id型別外,指標變數只能呼叫它編譯時型別的方法。而不能呼叫它執行時型別的方法,即使它實際所指向的物件包含該方法。如果需要讓這個指標變數呼叫執行時型別的方法,就需要強制型別轉換。import intmain intargc,const char ar return0 2014 11 29 15 2...

指標強制型別轉換

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