c++ - 何时使用 unsigned char 指针

标签 c++ pointers

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/

相关文章:

c - 以下语句是将物理地址还是虚拟地址分配给指针?

c++ - Boost Fusion 文章、示例、教程?

c++ - 是否可以覆盖 boost::bimaps::bimap.left 的 "find"和 "erase"方法?怎么做?

c++ - 套接字 : multithreading doesn't work when client reads messages

c - 用指针交换变量

c++ - 初始化指向模板的指针时未解析的外部符号

c++ - 通过 `void *` 和 C++ `extern "C"` 函数调用在 C 中初始化一个 C++ 类

c++ - OpenGL屏幕坐标到世界坐标

c++ - 如何注释#if、#else、#endif 预处理器构造?

c++ - 使数组更节省内存