3 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
是否可以取消引用void指針而不用C編程語言進(jìn)行類型轉(zhuǎn)換...
否,void表示沒有類型,您不能取消引用或分配給它。
有沒有一種方法可以泛化一個(gè)可以接收指針并將其存儲(chǔ)在void指針中的函數(shù),通過使用該void指針,我們可以創(chuàng)建一個(gè)泛化的函數(shù)。
您不能僅僅以可移植的方式取消引用它,因?yàn)樗赡芪凑_對(duì)齊。在像ARM這樣的某些體系結(jié)構(gòu)上,這可能是個(gè)問題,其中指向數(shù)據(jù)類型的指針必須在數(shù)據(jù)類型的大小的邊界處對(duì)齊(例如,指向32位整數(shù)的指針必須在4字節(jié)邊界處對(duì)齊才能取消引用)。
例如,uint16_t從閱讀void*:
/* may receive wrong value if ptr is not 2-byte aligned */
uint16_t value = *(uint16_t*)ptr;
/* portable way of reading a little-endian value */
uint16_t value = *(uint8_t*)ptr
| ((*((uint8_t*)ptr+1))<<8);
另外,是否可以使用帶空指針的指針?biāo)阈g(shù)...
void由于缺少指針下方的具體值以及大小,因此無法對(duì)指針進(jìn)行算術(shù)運(yùn)算。
void* p = ...
void *p2 = p + 1; /* what exactly is the size of void?? */

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
在C語言中,void *無需顯式轉(zhuǎn)換即可將a轉(zhuǎn)換為指向不同類型對(duì)象的指針:
void abc(void *a, int b)
{
int *test = a;
/* ... */
但是,這不利于以更通用的方式編寫函數(shù)。
您不能通過void *將a 轉(zhuǎn)換為其他指針類型來取消引用,因?yàn)槿∠弥羔槙?huì)獲得指向?qū)ο蟮闹?。裸名void不是有效類型,因此無法取消引用a void *。
指針?biāo)阈g(shù)是將指針值更改為sizeof所指向?qū)ο蟮谋稊?shù)。同樣,由于void不是真正的類型,sizeof(void)因此沒有任何意義,因此指針?biāo)惴ㄔ谏蠠o效void *。(某些實(shí)現(xiàn)允許使用,將等效指針?biāo)惴ㄓ糜赾har *。)
- 3 回答
- 0 關(guān)注
- 568 瀏覽
添加回答
舉報(bào)