【问题标题】:How does this loop end?这个循环如何结束?
【发布时间】:2013-05-14 05:36:12
【问题描述】:

代码示例如下:

#include<stdio.h>
void main()
{
    char *s={"abcd"};
    do {
        printf("%d\n",++s);
    } while(*s);
}  

循环结束时指针s指向哪里?它是如何工作的?

【问题讨论】:

  • 你的 printf 告诉你什么?
  • s 指向循环结束时'd' 之后的 0 字节。
  • 顺便说一下,您不应该使用%d 作为printf 中的指针。如果要打印出指针值,请使用%p

标签: c string char cstring


【解决方案1】:

在 C 中,零等价于 false。因此,当*s 指向字符串中的终止符(零)时,循环停止。

【讨论】:

    【解决方案2】:

    “abcd”以 5 个连续字节存储在内存中:'a' 'b' 'c' 'd' '\0'

    最后一个字节零终止循环,因为零在 C 中为假。

    【讨论】:

      【解决方案3】:

      首先,您不应该使用%d 来格式化指针,它是用于整数,而不是用于指针。请改用%p

      这一行-

      char *s={"abcd"};
      

      '\0' 作为最后一个字符来初始化字符串。

      您的程序循环遍历字符串的每个字符(从第 2 个到最后一个),并打印它们在内存中的存储地址。由于是do-while循环,条件检查是在循环体执行后进行的。

      注意:它不会打印第一个字符的地址,因为-

      printf("%d\n",++s);
      

      这一行(由于前缀增量)在将其值传递给printf 之前将指针递增到下一个字符。所以当第一次执行循环体时,会打印第二个字符(b)的地址。

      现在循环的条件部分检查s指向的字符(*s可以引用该字符)是否非零。

      由于字符串的最后一个字符为'\0'(整数值为0),因此循环在到达最后一个字符时终止。

      您的程序的输出(将%d 更改为%p)将是类似不完全相同 -

      0x40061d
      0x40061e
      0x40061f
      0x400620
      

      注意只打印了4个地址(从'b''\0''a'的地址不打印)。要做到这一点,你应该试试这个 -

      #include<stdio.h>
      main()
      {
          char *s={"abcd"};
          do {
              printf("%p\n",s++);
          } while(*s);
          printf("%p\n", s); // to print the address of the '\0' character.
      }
      

      【讨论】:

      • 谢谢,但是为什么我把abcd换成其他四个字符后结果一直不变?
      • @Z-Cao 正在打印字符的地址。地址可能会或可能不会改变。它指向什么字符并不重要。要打印字符,请使用printf("%c\n", *s);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 2017-08-31
      • 2021-12-31
      • 1970-01-01
      • 2017-04-18
      相关资源
      最近更新 更多