利用指標進行型別強制轉換(c指標詳解)

2021-06-27 16:05:31 字數 1247 閱讀 6736

今天看《c指標詳解》(好像也有叫《深入理解c指標》的)的時候,看到乙個有關型別轉換的例子。

例十六: 

void fun(char*);

int a=125,b;

fun((char*)&a);

void fun(char*s)

第一眼看到這個例子的時候,我原本以為這個函式的功能是要將整型數字125進行倒置轉換的,如125變作521,於是寫了對歷程進行了一下修改

#include

void fun(char *s)

int main()

發現輸出為:

2097152000

這跟我想的完全不一樣,於是我仔細看了下解釋,發現原文是這樣寫的:

」注意這是乙個32 位程式,故int 型別佔了四個位元組,char 型別佔乙個

位元組。函式fun 的作用是把乙個整數的四個位元組的順序來個顛倒。注意 

到了嗎?「

看到這裡我大概明白這個函式的意思了,是利用指標在對暫存器裡儲存的變數的位進行處理。鑑於125這個數碼化作二進位制不太好處理,我將主程式第一行改為

int a=1;

因為我用的是32位系統,int型別佔4個位元組,那麼在我的機器中1的機器數碼形式應為

00000000 00000000 00000000 00000001

每個位元組佔8個位元位,函式fun對第1、4位,第2、3位進行了交換,那麼交換之後a的儲存形式變為

00000001 00000000 00000000 00000000

此時,printf之後,a的輸出應為

2^24(2的24次方),即

16777216

在vc中我驗證了該結果

另外做為指標新手特別需要注意的是(見原文):

如果有乙個指標p,我們需要把它的型別和所指向的型別改為

tyep *type, 那麼語法格式是: 

(type *)p; 

這樣強制型別轉換的結果是乙個新指標,該新指標的型別是 

type *,它指向的型別是type,它指向的位址就是原指標指向的位址。 

而原來的指標p 的一切屬性都沒有被修改。(切記)

對應上述例子就是&a該指標(沒有賦值給類似*a什麼的指標,但是從指標的定義角度講&a確實是指標,不要以為變數初始化階段帶*的才是指標。)經過函式fun的處理之後,&a的一切屬性都沒有被修改,即&a指向的位址中儲存的a的值的屬性仍然是int型而不是char型,所以在printf驗證a輸出的時候,仍熱是%d形式輸出而不是%s或者%c。

指標強制型別轉換

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

指標型別強制轉換

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

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

一 什麼是指標變數?指標變數,實質上是乙個變數,只是它是存放位址的變數,指標的型別代表的是它所指向的變數的型別,因此就有了指向整形 字元型 浮點型等其他型別的指標。但實際上所有型別的指標變數存放的都是int型的位址 16位的編譯系統,int是2位元組 32的編譯系統,int是4位元組 本質上,不同型...