C++中unsigned char*、reinterpret_cast及数组参数相关问题咨询
C++代码问题解析
#include <iostream> using namespace std; void printArray(double* array, int array_size) { cout << "Array: "; for (int i = 0; i < array_size; i++) cout << array[i] << " "; cout << endl; } int main() { double d[] = {0, 0, 0, 0, 0}; unsigned char* uchar_ptr = reinterpret_cast<unsigned char*>(d); printArray(d, 5); for (int i = 0; i < 5; i++) for (int j = 0; j < sizeof(double); j++) uchar_ptr[i * sizeof(double) + j] = 1; printArray(d, 5); }
问题解答
1. unsigned char*的具体定义和作用是什么?
unsigned char* 是指向无符号字符类型的指针,每个指针指向的内存单元固定占1字节,取值范围为0~255。这段代码中用它的核心目的是实现字节级内存操作:因为原生数组是double类型,默认按8字节(主流平台double占8字节)为单位读写,用unsigned char*做中转就可以逐个修改数组内存里每个字节的内容。
2. 代码中reinterpret_cast<unsigned char*>(d)实现了什么功能?
reinterpret_cast是C++的底层强制类型转换运算符,它不会修改指针指向的实际内存地址,只会改变编译器对这段内存的类型解释规则。
这里的d是double数组的数组名,作为指针时默认是double*类型,操作时按8字节为单位偏移。经过转换后得到的uchar_ptr是unsigned char*类型,后续用这个指针操作内存时,会按1字节为单位偏移、读写,方便我们逐个修改每个字节的值。
3. printArray函数的形参为什么设计为double* array,而非double array?
有两个核心原因:
- 如果形参写
double array,代表只接收单个double类型的数值,根本无法传入整个数组; - C/C++的原生数组作为参数传递时,会自动退化为指向数组首元素的指针,用
double* array可以正确接收数组的首地址,后续通过指针偏移就能访问数组内的所有元素。原生数组本身不支持直接按值传递给函数参数,所以不能直接写double array。
4. 为什么数组的每个元素没有被设置为数值1?
double类型的数值存储遵循IEEE 754双精度浮点数标准,不是把内存的所有字节设为1就对应数值1。
一个8字节的double的二进制分为三部分:1位符号位、11位指数位、52位尾数位。你把每个字节都设为1,相当于这个double的64个二进制位全是1,这个值在IEEE 754标准里属于特殊的NaN(非数字)值,完全不是数值1。
数值1对应的double存储的十六进制是0x3FF0000000000000,和全1的内存内容完全不同,所以最终打印出来的结果肯定不是1。
内容的提问来源于stack exchange,提问作者SiddTheKid
相关产品推荐
相关产品推荐

