【问题标题】:why char* why not bool* can be used in write function in c++ file I/O为什么 char* 为什么不 bool* 可以用于 c++ 文件 I/O 中的写入函数
【发布时间】:2015-05-22 19:23:24
【问题描述】:

在这个语句中为什么将 x 转换为 char* 而不是 bool*-

out.write( (char*)&(x), sizeof(double) );

【问题讨论】:

  • 可能是因为在创建 C++ 并且在 C 中使用 char* 时 bool 不是标准 C 类型。
  • 为什么应该是char* 是一个可以理解的问题。但我不明白为什么你会期望它是bool*
  • 尤其是sizeof(double)
  • 你想用这段代码做什么?
  • out 是如何定义的?你为什么认为bool* 有意义?

标签: c++ file io typecasting-operator


【解决方案1】:

一个布尔值有两个值:真和假。

除非缓冲区中的每个字节只有两个值之一,否则选择表示任意数据将是一种非常愚蠢的类型。

char 被视为传统的“一些字节”类型。因此,char* 是传统的“指向某些字节的指针”类型。

【讨论】:

  • 此外,通常选择char*,因为它以一字节块的形式访问数据。 (而不是总是使用int*,它只能指向每四个字节。
【解决方案2】:

在这个语句中为什么将 x 转换为 char* 而不是 bool* ...

它怀疑您认为bool,从概念上讲是一位,是 C++ 中最基本的数据类型。事实并非如此。个别位在 C++ 中不可寻址。 C++ 内存模型是围绕字节的概念组织的,字节必须至少包含八位。根据定义,char(以及相关类型 signed charunsigned char)正好是一个字节长。

位不可寻址意味着布尔数据类型的概念不太适合内存模型。连续的布尔值要么在它们之间有间隙(这对于您建议的转换为bool* 会产生问题),要么布尔值可以包含比falsetrue 更多的值(也有问题;布尔值包含的值不是falsetrue 是未定义的行为)。

C++ I/O 模型将基于字节的内存模型扩展到 I/O。 C++ I/O 流包含一个字节序列(在宽字符的情况下有时是多个字节),而不是一个位序列。这就是为什么std::basic_ostream::write 将某个字符类型的指针(通常是char)和一个大小作为参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2012-12-28
    • 2019-11-17
    • 2017-03-08
    相关资源
    最近更新 更多