将无符号字符*转换为无符号字符**,而不使用&

Casting unsigned char* to unsigned char** without &

本文关键字:无符号 字符 转换      更新时间:2023-10-16

我有这段代码

unsigned char* MemoryPool::GetNext(unsigned char* pBlock)
{
unsigned char** ppChunkHeader = (unsigned char**)pBlock;
return ppChunkHeader[0];
}

摘自这里http://gamecode4.googlecode.com/svn/trunk/Source/GCC4/Memory/MemoryPool.cpp

我不知道从unsigned char*转换为unsigned char**是做什么的。如果我添加以下代码行:

unsigned char* MemoryPool::GetNext(unsigned char* pBlock)
{
    unsigned char **ppChunkHeader = (unsigned char**)pBlock;
    printf("ppChunkHeader %pn", ppChunkHeader);
    printf("pBlock %pn", pBlock);
    printf("sizeof(unsigned char*) = %in", sizeof(unsigned char*));
    printf("ppChunkHeader[0] %pn", ppChunkHeader[0]);
    printf("&pBlock[0] %pn", &pBlock[0]);
    printf("ppChunkHeader[0] - &pBlock[0] = %pn", (ppChunkHeader[0] - &pBlock[0]));
    return ppChunkHeader[0];
}

输出为

ppChunkHeader 00DCB498
pBlock 00DCB498
sizeof(unsigned char*) = 4
ppChunkHeader[0] 00DCB4A1
&pBlock[0] 00DCB4A1
ppChunkHeader[0] - &pBlock[0] = 00000009

我认为有必要提一下,在我的代码中,pBlock指向一个包含9个元素的数组。

谢谢。

如果不看下一行代码,就无法理解强制转换

unsigned char** ppChunkHeader = (unsigned char**)pBlock;
return ppChunkHeader[0];

pBlock是一个内存块,下一行的强制转换和解引用所做的是获取该块的前四个字节,并将其视为另一个指针。然后从函数返回第二个指针。

你可以看到强制转换并没有改变指针的值,ppChunkHeader和pBlock是相同的值。不同之处在于它们所指向的东西是如何被解释的。如果你写

return pBlock[0];

将只是一个字符,因为pBlock是一个unsigned char*。但是ppChunkHeader[0]是一个无符号char*,因为ppChunkHeader是一个无符号char**。