两个指针之间的转换/转换

Bat*_*u89 2 c++ pointers casting

最近我一直在用文件流做很多练习.当我fstream.write(...) 用来写例如10个整数(intArr[10])的数组时,我写道:

fstream.write((char*)intArr,sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)

(char*)intArr-cast安全吗?到目前为止我没有遇到任何问题,但我了解了static_cast(c ++方式正确吗?)并且使用了static_cast<char*>(intArr)它失败了!我无法理解......我应该改变我的方法吗?

Ker*_* SB 5

静态演员不是正确的事情.当有问题的类型可以自然转换时,您只能执行静态转换.但是,不相关的指针类型不能隐式转换; 即,一般T*不可兑换U*.你真正在做的是重新解释演员:

int intArr[10];

myfile.write(reinterpret_cast<const char *>(intArr), sizeof(int) * 10);
Run Code Online (Sandbox Code Playgroud)

在C++中,C风格(char *)的转换成为最合适的转换类型,其中最弱的是重新解释转换.使用显式C++样式转换的好处是,您可以证明您了解所需的转换类型.(另外,没有C等价于a const_cast.)

也许注意到差异是有益的:

float    q  = 1.5;
uint32_t n  = static_cast<uint32_t>(q);      // == 1, type conversion
uint32_t m1 = reinterpret_cast<uint32_t>(q); // undefined behaviour, but check it out
uint32_t m2 = *reinterpret_cast<const uint32_t *>(&q); // equally bad
Run Code Online (Sandbox Code Playgroud)

偏离主题:编写最后一行的正确方法涉及更多,但使用了大量的强制转换:

uint32_t m;
char * const pm = reinterpret_cast<char *>(&m);
const char * const pq = reinterpret_cast<const char *>(&q);
std::copy(pq, pq + sizeof(float), pm);
Run Code Online (Sandbox Code Playgroud)

  • @ Bat0u89:`reinterpret_cast`被明确允许从`T*`到`char*`,正好适合你的情况(序列化).所以扔掉,快乐! (2认同)