簡體   English   中英

在C中鍵入Casting Pointer

[英]Type Casting Pointer in 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,傳遞結構的salt字段。

salt字段是一個包含4個元素的數組,每個元素的數據類型為BF_WORD(32位字或4字節)

在func2中

dst是指向BF_WORD類型元素的數組的名稱。

它正在對指針執行類型轉換,dst。

目前,dst指向數據類型BF_WORD。 它是類型化的,因​​此它指向一個char(1字節數據)。

現在它正在對整數c1和c2執行bithift操作,並將輸出寫入dptr指向的內存地址。 因此,它覆蓋了dst最初指向的數據(salt數組中的字節)。

c1和c2的數據類型為int,需要4個字節的空間。

dptr會以什么方式覆蓋數組的內容? 從每次,我們做* dptr ++,我們將指針dptr推進1個字節,因為它指向一個字符。

但是,我們正在為它分配一個大於1個字節的值。 如何將數據寫入內存?

謝謝。

只有結果的最低字節才會寫入內存。 由於指針是一個char,int將被截斷,並且較高的字節將被丟失,因為它被轉換為左值的類型; 您只需將結果分配給char變量就可以使用相同的規則。 有關詳細信息,請參見標准部分6.3.2.1和6.5.16.1。

這里

*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);

執行對unsigned char的隱式轉換,因為dptr的類型為unsigned char * ,因此*dptr被視為unsigned char

您對上述代碼的理解與我的相似,也讓我對自己的一些想法有所了解

unsigned char * dptr= (unsigned char*)dst;

這里dst類型為BF_WORD(4字節),向下轉換為char類型(1字節)另外值得注意的是,雖然指針的類型是char,並且可以一次導航一個字節,但它確實成立4字節連續內存位置的地址,因此從技術上講,必須巧妙地導航這4個字節,一次一個字節。

dptr會以什么方式覆蓋數組的內容?

dptr現在包含4個數字的起始地址,4字節數組鹽。 所以它目前訪問salt [0]。 這里salt [0]的大小為4個字節,dptr是1個​​字節的指針,因此需要四個(dptr ++)增量來覆蓋數組salt [0]的一個元素。

現在是另一個問題

我們正在為它分配一個大於1個字節的值。 如何將數據寫入內存?

*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);

這里c1和c2都是int類型,因此在按位運算后,結果的類型為int。 因此,4字節結果寫入dptr指向的salt [0]; 在dptr的下一個增量中,指針將指向前一個4字節結果的2個字節,因此前一個結果的最后三個字節將被下一個按位結果溢出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM