c++ - 将 unsigned char* 转换为 unsigned char**(不带 &)

标签 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 个元素的数组。

谢谢。

最佳答案

不看下一行代码就无法理解转换

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

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

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

return pBlock[0];

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

关于c++ - 将 unsigned char* 转换为 unsigned char**(不带 &),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16092777/

相关文章:

c++ - 防止双重删除指针

c - 泛化函数指针

casting - NSDictionary objectForKey 运行时错误的 stringValue

java - SonarQube (SonarLint/Sonar-JAVA) 不应使用冗余强制转换

c++ -::运算符必须与 tolower() 一起使用吗?

c++ - C++ 中的 Lost Focus 和 GotFocus

c++ - 通过成员初始化列表初始化结构体

c - 难以理解这段代码的工作原理(双指针)

c++ - 如何在 C++ 中正确向下转换

c++ - 使用模板插入函数丢失数字