3 回答

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
指向的指針void是“通用”指針類型。void *可以將A 轉(zhuǎn)換為任何其他指針類型,而無需顯式強(qiáng)制轉(zhuǎn)換。您不能取消引用a void *或?qū)ζ鋱?zhí)行指針?biāo)阈g(shù);您必須先將其轉(zhuǎn)換為指向完整數(shù)據(jù)類型的指針。
void *通常用于需要在同一代碼中使用不同指針類型的地方。一個(gè)經(jīng)常被引用的例子是庫函數(shù)qsort:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
base是數(shù)組的地址,是數(shù)組nmemb中元素的數(shù)量,size是每個(gè)元素的大小,并且compar是指向比較數(shù)組中兩個(gè)元素的函數(shù)的指針。它的調(diào)用方式如下:
int iArr[10];
double dArr[30];
long lArr[50];
...
qsort(iArr, sizeof iArr/sizeof iArr[0], sizeof iArr[0], compareInt);
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareDouble);
qsort(lArr, sizeof lArr/sizeof lArr[0], sizeof lArr[0], compareLong);
陣列表達(dá)式iArr,dArr以及l(fā)Arr隱式從數(shù)組類型轉(zhuǎn)換為指針類型的函數(shù)調(diào)用,并且每個(gè)被隱式地從“指針轉(zhuǎn)換int/ double/ long”到“指針void”。
比較功能如下所示:
int compareInt(const void *lhs, const void *rhs)
{
const int *x = lhs; // convert void * to int * by assignment
const int *y = rhs;
if (*x > *y) return 1;
if (*x == *y) return 0;
return -1;
}
通過接受void *,qsort可以使用任何類型的數(shù)組。
使用void *它的缺點(diǎn)是您將類型安全性丟到了窗外并迎面而來。沒有什么可以防止您使用錯(cuò)誤的比較例程:
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);
compareInt期望其參數(shù)指向ints,但實(shí)際上與doubles 一起使用。在編譯時(shí)沒有辦法解決這個(gè)問題。您將得到一個(gè)錯(cuò)誤排列的數(shù)組。

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用void *表示該函數(shù)可以采用不需要為特定類型的指針。例如,在套接字函數(shù)中,
send(void * pData, int nLength)
這意味著您可以通過多種方式調(diào)用它,例如
char * data = "blah";
send(data, strlen(data));
POINT p;
p.x = 1;
p.y = 2;
send(&p, sizeof(POINT));

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
就這一點(diǎn)而言,C非常出色??梢哉f虛無就是虛無虛無*是一切(可以是一切)
只是這個(gè)微小的*有所作為。
雷內(nèi)指出了這一點(diǎn)。無效*是指向某個(gè)位置的指針。怎樣“解釋”什么留給用戶。
這是在C中具有不透明類型的唯一方法。可以在glib或常規(guī)數(shù)據(jù)結(jié)構(gòu)庫中找到非常突出的示例。在“ C接口和實(shí)現(xiàn)”中對其進(jìn)行了非常詳細(xì)的介紹。
我建議您閱讀完整的章節(jié)并嘗試?yán)斫狻矮@取它”的指針的概念。
- 3 回答
- 0 關(guān)注
- 1250 瀏覽
添加回答
舉報(bào)