将unsigned char *转换为unsigned char **而不使用&

时间:2013-04-18 20:47:40

标签: c++ pointers casting

我有这段代码

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 %p\n", ppChunkHeader);
    printf("pBlock %p\n", pBlock);

    printf("sizeof(unsigned char*) = %i\n", sizeof(unsigned char*));

    printf("ppChunkHeader[0] %p\n", ppChunkHeader[0]);
    printf("&pBlock[0] %p\n", &pBlock[0]);

    printf("ppChunkHeader[0] - &pBlock[0] = %p\n", (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个元素的数组。

谢谢。

1 个答案:

答案 0 :(得分:2)

如果不查看下一行代码

,就无法理解演员阵容
unsigned char** ppChunkHeader = (unsigned char**)pBlock;
return ppChunkHeader[0];

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

你可以看到强制转换不会改变指针的值,ppChunkHeader和pBlock是相同的值。它们指向的内容有何不同之处。如果你写了

return pBlock[0];

这只是一个char,因为pBlock是一个unsigned char *。但是ppChunkHeader [0]是一个unsigned char *,因为ppChunkHeader是一个unsigned char **。