unsigned char
指针有什么用?我在很多地方都看到指针被类型转换为指向 unsinged char
的指针 我们为什么要这样做?
我们收到一个指向int
的指针,然后将其类型转换为unsigned char*
。但是,如果我们尝试使用 cout 打印该数组中的元素,它不会打印任何内容。为什么?我不明白。我是 C++ 的新手。
编辑下面的示例代码
int Stash::add(void* element)
{
if(next >= quantity)
// Enough space left?
inflate(increment);
// Copy element into storage, starting at next empty space:
int startBytes = next * size;
unsigned char* e = (unsigned char*)element;
for(int i = 0; i < size; i++)
storage[startBytes + i] = e[i];
next++;
return(next - 1); // Index number
}
最佳答案
你实际上是在寻找pointer arithmetic :
unsigned char* bytes = (unsigned char*)ptr;
for(int i = 0; i < size; i++)
// work with bytes[i]
在这个例子中,bytes[i]
等于*(bytes + i)
它用于访问地址上的内存:bytes + (i* sizeof(*bytes))
.换句话说:如果你有 int* intPtr
然后你尝试访问 intPtr[1]
,您实际上正在访问存储在字节中的整数:4 到 7:
0 1 2 3
4 5 6 7 <--
指针指向的类型的大小会影响它在递增/递减后指向的位置。因此,如果您想逐字节迭代数据,则需要有一个指向大小为 1 字节的类型的指针(这就是 unsigned char*
的原因)。
unsigned char
通常用于保存二进制数据,其中 0
是有效值,仍然是您数据的一部分。在与“裸体”一起工作时unsigned char*
您可能必须保持缓冲区的长度。
char
通常用于保存表示字符串和0
的字符等于'\0'
(终止符)。如果您的字符缓冲区始终以 '\0'
结尾,您不需要知道它的长度,因为终止字符准确指定了数据的结尾。
请注意,在这两种情况下,最好使用一些对象来隐藏数据的内部表示并为您管理内存(参见 RAII idiom )。所以最好还是使用 std::vector<unsigned char>
(对于二进制数据)或 std::string
(对于字符串)。
关于c++ - 何时使用 unsigned char 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14769917/