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
}
Run Code Online (Sandbox Code Playgroud)
你实际上在寻找指针算术:
unsigned char* bytes = (unsigned char*)ptr;
for(int i = 0; i < size; i++)
// work with bytes[i]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,bytes[i]等于*(bytes + i)并且它用于访问地址上的内存:bytes + (i* sizeof(*bytes)).换句话说:如果您有int* intPtr并尝试访问intPtr[1],则实际上是访问以字节存储的整数:4到7:
0 1 2 3
4 5 6 7 <--
Run Code Online (Sandbox Code Playgroud)
指针指向的类型大小会影响它递增/递减后指向的位置.因此,如果要逐字节迭代数据,则需要指向1字节大小的指针(这就是原因unsigned char*).
unsigned char通常用于保存二进制数据,其中0有效值仍然是数据的一部分.在使用"裸体"时,unsigned char*您可能需要保持缓冲区的长度.
char通常用于保存表示字符串的字符,0并且等于'\0'(终止字符).如果您的字符缓冲区始终以终止'\0',您不需要知道它的长度,因为终止字符确切地指定了数据的结尾.
请注意,在这两种情况下,最好使用一些隐藏数据内部表示的对象,并为您处理内存管理(请参阅RAII惯用法).所以最好使用std::vector<unsigned char>(对于二进制数据)或std::string(对于字符串).
在C中,unsigned char唯一的类型是保证没有陷印值,并且保证复制将产生精确的按位图像.(C++也扩展了这种保证char.)因此,它传统上用于"原始内存"(例如,语义memcpy定义unsigned char).
此外,无符号整型一般是指使用时按位运算(&,|,>>等)都将被使用. unsigned char是最小的无符号整数类型,可以在操作使用按位运算的小值数组时使用.偶尔也会使用它,因为在溢出的情况下需要模数行为,尽管对于较大的类型(例如在计算散列值时)这种情况更常见.这两个原因通常都适用于无符号类型; unsigned char通常只在需要减少内存使用时才用于它们.
| 归档时间: |
|
| 查看次数: |
17631 次 |
| 最近记录: |