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

时间:2011-10-01 22:07:59

标签: c++ pointers casting

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

fstream.write((char*)intArr,sizeof(int)*10);

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

1 个答案:

答案 0 :(得分:5)

静态演员不是正确的事。当有问题的类型可以自然转换时,您只能执行静态转换。但是,不相关的指针类型可以隐式转换;即T*一般不能转换为U*或来自int intArr[10]; myfile.write(reinterpret_cast<const char *>(intArr), sizeof(int) * 10); 。你真正在做的是重新解释演员:

(char *)

在C ++中,C风格的转换const_cast成为最合适的转换类型,其中最弱的是重新解释转换。使用显式C ++样式转换的好处是,您可以证明您了解所需的转换类型。 (此外,没有C等效于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 。)

注意差异可能是有益的:

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);

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

{{1}}