我正在查看
memcpy
的实现,并且想知道,为什么需要将指针 pDst
转换为 unsigned char
? pSrc
也一样吗?
void memcpy( void *pDst, void *pSrc, int len )
{
int i;
if( pDst == NULL || pSrc == NULL )
return;
for( i=0; i<len; i++ ) {
((unsigned char*)pDst)[i] = ((unsigned char*)pSrc)[i];
}
}
指向
void
的指针是表示“指向任何东西的指针”的有用简写,但相反,编译器并不知道所指向的东西有多大。
因此,当您对它进行任何类型的算术(例如将其索引为数组)时,您必须使用一些显式大小。在这种情况下,因为您尝试进行逐字节复制,所以您使用
unsigned char
的强制转换,这通常是表示“1 字节”的一种方式。
(乍一看这似乎是always正确的。但是在
memcpy
之外的情况下,您可能会指向更大的东西,比如某种结构,那么索引/算术实际上会指的是增量该结构的大小,以便您可以从一个结构跳到下一个。)
因为你无法取消引用
void*
。您必须明确告诉编译器您希望它复制多少字节。如果是 unsigned char
,则为 1。
您必须将其转换为
char *
或 unsigned char *
来告诉编译器必须添加多少字节,在 char *
或 unsigned char *
情况下将添加 1 个字节。
下一个元素 = 实际上元素 + (i * 类型的长度)
并且 void *
是一种无内容类型,因此您必须将其转换为 char *