将无符号字符*转换为无符号字符**,而不使用&
Casting unsigned char* to unsigned char** without &
我有这段代码
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**。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中