【问题标题】:difference between pen and *pen in this code [closed]此代码中 pen 和 *pen 之间的区别 [关闭]
【发布时间】:2020-03-01 20:50:51
【问题描述】:
int main(void)
{

    char mine[5] = "hello";
    char *pen = mine;

    while(*pen != '\0')
    {
        printf("%c\n", *pen);
        pen++;
    }


}



int main(void)
{

    char mine[5] = "hello";
    char *pen = mine;

    while(*pen != '\0')
    {
        printf("%c\n", *pen);
        *pen++;
    }


}

我正在尝试用字符串掌握指针的概念。我运行了这两个代码并得到了相同的结果,但是我在使用 *pen++ 的代码的第二个版本时收到了警告,但仍然能够运行。 他们每个人都在做什么,为什么它给了我相同的输出?

【问题讨论】:

  • 请注意char mine[5] = "hello"; 缺少代码正在寻找的空终止符。它需要是 char mine[6] = "hello";char mine[] = "hello";

标签: c string pointers


【解决方案1】:

根据operator precedence上的规则,行

*pen++;

等价于

*(pen++);

这意味着* 什么都不做。所以它和这条线做的完全一样

pen++;

在第一个程序中。

另外,重要的是要注意这一行

char mine[5] = "hello";

没有按照您的预期进行。您正在使用长度为 6 的字符串文字(包括终止空字符)初始化长度为 5 的字符数组。这意味着该数组没有足够的空间容纳终止空字符。

因此,您应该将行更改为以下内容:

char mine[6] = "hello";

或者,为了让编译器自动为初始化分配足够的内存,你可以写如下:

char mine[] = "hello";

【讨论】:

  • 请注意char mine[5] = "hello"; 有效的C。数组必须是字符串是没有道理的。无效的是依赖于缺失空终止符的字符串操作。
  • char mine[5] = "hello"; is valid C per C 2018 6.7.9 14: “… 字符串文字的连续字节(如果有空间,则包括终止空字符,或者如果数组的大小未知)初始化数组的元素。”
  • @EricPostpischil:感谢您引用 C 标准,您说服了我。我已经相应地编辑了我的答案。
【解决方案2】:

pen++; 是由一个表达式pen++ 组成的语句。此表达式的值为pen,副作用是pen 递增。

*pen++ 是由一个表达式 *pen++ 组成的语句。表达式的值为*pen,副作用是pen 递增。

当表达式用作语句时,表达式的值被忽略,只有副作用是相关的/可观察的。因此,在您的情况下,如果 pen*pen 是值无关紧要,增加 pen 的副作用在两种情况下都是相同的。因此,在您的程序中,两种变体具有相同的可观察效果。但是,如果您不想使用该值,则编写 *pen++ 是没有意义的。那你应该写pen++,或者更好的++pen

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2023-03-20
    • 2016-04-01
    • 2013-01-04
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多