-1

像这样的代码示例:

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

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

4

3 回答 3

4

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

于 2013-05-19T15:35:48.207 回答
3

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

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

于 2013-05-19T15:36:23.953 回答
0

首先,您不应该使用%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.
}
于 2013-05-19T16:40:11.280 回答