#include<stdio.h>
void main()
{
char *s={"abcd"};
do {
printf("%d\n",++s);
} while(*s);
}
当循环结束时指针指向何处?它是如何工作的?
答案 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.
}