關於強制轉換

2021-09-30 12:19:04 字數 2066 閱讀 6038

1. a和&a的區別:

&a是整個陣列的首位址,a是陣列首元素的首位址,其值相同,但是意義不同。

eg:char a[5] = ;

char (*p1)[5] = &a; //沒有問題,char (*p1)[5]是陣列指標,指向陣列a[5]的首位址。

char (*p2)[5] = a; //編譯出錯,提示型別無法從「char [5]」轉換為「char (*)[5]。

需要把a進行強制轉化:(char (*)[5])a;

其中:char (*p1)[5] = &a; //p1指向位址為0x0012ff58;

p1++; //p1此時指向位址為0x0012ff5d;

備註:p1 + 5*sizeof(陣列元素型別)

p1++操作越過了這個char a[5]陣列的位址範圍。

2. 強制轉化

eg:struct test

*p;假設p的值為0x100000,那麼如下表示式的值分別為多少?

a. p + 0x1 = 0x????

b. (unsigned long)p + 0x1 = 0x????

c. (unsigned int*)p + 0x1 = 0x????

a: 我們會遇到乙個誤區,那就是指標變數與乙個整數相加減的問題,並不是我們想象

的那樣用指標變數裡的位址直接加減這個整數,這個整數的單位不是byte而是元素的個數。

從而p + 0x1的值為:0x100000 + sizeof(test)*0x1,而sizeof(test)大小為20byte,

所以p + 0x1的值為:0x100014

b: 這裡涉及強制轉換,將指標變數p儲存的值強制轉換成無符號的長整型數,任何數值一旦被

強制轉換,其型別就改變了,從而這個表示式其實就是乙個無符號的長整型數加上另外乙個整數,

所以其值為:0x100001

c: 這裡p被強制轉化成乙個指向無符號整型的指標,所以其值為:0x100000 + sizeof(unsigned int*) * 0x1 = 0x100004

我們再來看乙個具體例子:

int main()

; int *ptr1 = (int *)(&a + 1);

int *ptr2 = (int *)((int)a + 1);

printf("%x %x",ptr1[-1],*ptr2);

return 0;

}對於ptr1: 將&a + 1的值強制轉換成int *型別,賦值給int *型別的變數ptr1,那麼ptr1的指向如下圖所示:

ptr1[-1]被解析成*(ptr1 - 1),即ptr1往後退4個byte,從而其值為0x4.

對於ptr2: 按照上述b中的解釋,(int)a是強制轉化,就是把乙個位址強制轉化為了乙個int型別的整數,(int)a + 1

就是從a或者a[0]開始往後加1個位元組,也就是(int)a + 1的值為元素a[0]的第二個位元組的位址(注意:a[0]佔4個位元組),然後把

這個位址強制轉化成int *型別的值賦值給ptr2,也就是說*ptr2的值應該為元素a[0]的第二個位元組開始連續4個byte的內容,記憶體布局如下圖所示:

i.按照大端模式存放:

a[0] 

a[1]

00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000010

提取後為:

高  低

00000000 00000000 00000001 00000000

值為0x100

ii.按照小端模式存放:

a[0] 

a[1]

00000001 00000000 00000000 00000000 00000010 00000000 00000000 00000000

提取後為:

低  高

00000000 00000000 00000000 00000010

值為0x2000000

這裡一定注意大小端模式在計算機內的儲存資料的順序和模式。

關於強制型別轉換

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...

關於強制型別轉換

思考 includeint main int ptr1 int a 1 int ptr2 int int a 1 printf x,x n ptr1 1 ptr2 return 0 輸出 4,2000000 我們先看第乙個我們知道ptr1 n ptr1 n 所以ptr1 1 實際上就說ptr所指的前...

關於 as ,is,和強制轉換

1.as只能用於引用型別不能用於值型別。2.操作符 as和 is 都只檢查被轉換物件的執行時型別,並不執行其他的操作 3.is的原理與as類似,不過它返回bool型別,is可與強制型別轉換搭配使用,可避免轉換異常,但最好不要把is和as搭配,實際上is也做了as的轉換操作,這樣會影響效率.4.如果我...