我正在通過一個C代碼,並想知道我是否正確地理解了代碼。類型鑄造指針在C
有一種結構,BF_salt在頭文件中定義,如下所示:
typedef
{
BF_WORD salt[4];
..
..
} BF_SALT;
在主C代碼,有對函數的調用:
function func1()
{
static BF_SALT salt;
func2(salt.salt,x,y);
....
}
func2(BF_WORD * dst,x,y)
{
unsigned char * dptr= (unsigned char*)dst;
int c1,c2;
// c1 and c2 are initialized here.
// in a loop, an operation similar to the below is performed.
*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
}
我的理解上面的代碼是:
在func1中,salt定義爲BF_SALT結構的數據類型。
我們調用func2,傳遞結構的鹽場。
鹽字段是4個元素的陣列,每個數據類型BF_WORD(32位字或4個字節)中FUNC2
DST
的是陣列的指向的元素的名稱鍵入BF_WORD。
它正在對指針dst執行一個類型轉換。
當前,dst指向數據類型BF_WORD。 它是類型鑄造,以便它指向一個字符(1字節數據)。
現在它正在對整數c1和c2執行移位操作,並將輸出寫入由dptr指向的內存地址。因此,它覆蓋了最初由dst指向的數據(salt數組中的字節)。
c1和c2的數據類型爲int,它需要4個字節的空間。
用什麼方法將dptr覆蓋數組的內容?因爲每次我們都做* dptr ++,所以我們將指針dptr前進1個字節,因爲它指向一個字符。
但是,我們正在爲它分配一個大於1個字節的值。數據如何寫入內存?
謝謝。
「*因此,4字節結果寫入由dptr指向的salt [0] ... *」,但只有最低字節被分配給'dptr'指向的內容,因爲它是'unsigned char *'!並且:哪個「* ...下一個按位結果。*」?我看不到任何迴路。 – alk 2013-02-27 18:11:23
@alk是的,我想到了,最低字節分配,如果其隱式typecasted,因此較高的3個字節被截斷, 但我猜只隱含類型轉換,如果左手分配是一個數據類型變量,而不是一個指針。 糾正我,如果我錯了 – 2013-02-27 18:17:22
在左邊有**取消引用**指針。請看* Leushenko *的答案,因爲他非常善良地查找標準。 – alk 2013-02-27 18:19:24