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.如果我...