这个循环如何结束?

时间:2013-05-19 15:33:50

标签: c string char cstring

像这样的代码示例:

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

当循环结束时指针指向何处?它是如何工作的?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

这一行 -

char *s={"abcd"};

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

你的程序循环遍历字符串的每个字符(从第二个到最后一个),打印出它们存储在内存中的地址。由于它是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.
}