【问题标题】:What does (char *)0 mean in c?(char *)0 在 c 中是什么意思?
【发布时间】:2011-05-20 13:53:03
【问题描述】:
if ( fgets( line, sizeof(line), stdin ) == (char*) 0 )...

我不明白这条线是做什么的,有人知道吗?

【问题讨论】:

  • 其中哪些部分你不明白?
  • @Martinho:你能详细说明一下吗?
  • @Martinho:是的,这是真的。当然,如果line 是一个实际的数组类型,它就可以工作。

标签: c syntax


【解决方案1】:

这是一种相当奇怪的方式来编写一个返回空指针的测试,它指示fgets() 中的错误。

我会这样写:

if (!fgets(line, sizeof(line), stdin))

【讨论】:

  • 这是个人品味。我个人的品味总是与NULL 相比较,因为它遵循函数的语义(它不返回布尔值)。
  • 我同意 Oli 的观点,这个观点也被广泛认可的 MISRA-C 标准所认同。只有布尔表达式应该与布尔运算符进行比较。
  • @Oli @Lundin 我的感觉是你不能用母猪的耳朵做一个丝绸钱包,而且尝试没有什么意义。
【解决方案2】:
(char*) 0

不是空字符,而是指向地址0处的字符的指针。

包含值 0 的字符将是:

(char) 0

【讨论】:

  • 不是指向字符@地址0的指针,而是指向空字符的指针(lysator.liu.se/c/c-faq/c-1.html)
  • @KevinDTimm char* c = (char*) 0 指向 0 可能存在的任何值(尽管在大多数平台上这并不重要,因为它是非法内存)。
  • @compile-fan 类型不同。文字 0 应该是 int 类型的大多数实现(与寄存器一样宽的 int 和 n 位整数)。 (char*) 只是将其转换为字符指针。
  • 那么(char *)1 是什么意思?
【解决方案3】:

这意味着一个指向 char 的空指针。如果将 (char*)0 替换为 NULL,则结果相同。在这种特殊情况下,它正在检查是否没有更多内容可以从标准输入中读取。我认为这只是一种神秘的方式,并展示了一些壮观而美丽的特征。如果将其替换为 NULL,则无需更改语义即可获得可读性。

【讨论】:

  • 其实就是指向空字符的指针——有区别
  • @Kevin 实际上,它没有。 fgets() 返回一个可能为 NULL 的指针。所以这段代码只是将结果与 NULL 进行比较的一种奇怪方式,它与 nul 字符无关。
  • 忽略 fgets(), 恕我直言 (char *)0 意味着 - 指向 null char 的指针,或指向 null 的 char 指针,但不是指向 char 的空指针 - 这似乎只是语义,但我相信那里是有区别的。
  • 这并不意味着指向“空字符”的指针,即 (char)0。在这种情况下,指针为零,而要成为指向 null char 的指针,指针必须为非 null 并指向第一个字节设置为 0 的内存地址。
【解决方案4】:

该行检查fgets是否返回0。转换为char*只是为了匹配fgets的返回类型:

char * fgets ( char * str, int num, FILE * stream );

但是如果你删除它,0 会隐式转换为char*

如果您需要有关fgets 的更多信息,请查看here

【讨论】:

    【解决方案5】:

    (char*)0 创建“空”指针。因此,您正在查看 fgets 的值是否为 null。

    fgets 的文档指出,当出现错误或到达文件末尾时,它会返回 null。

    完整的语句似乎是检查你是否在文件末尾,如果是这样的话(虽然这是一个猜测)。

    【讨论】:

      【解决方案6】:

      它只是检查 fgets 的结果是否有空字符指针。

      根据cplusplus.com

      返回值

      成功后,函数 返回相同的 str 参数。如果 遇到文件结尾并且没有 字符已被读取, str 的内容保持不变,a 返回空指针。

      如果出现错误 发生时,返回一个空指针。

      使用 ferror 或 feof 来检查 是否发生错误或 已到达文件结尾。

      【讨论】:

        猜你喜欢
        • 2012-04-17
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 1970-01-01
        • 2019-12-08
        • 2017-10-31
        • 1970-01-01
        • 2020-04-02
        相关资源
        最近更新 更多