像这样的代码示例:
#include<stdio.h>
void main()
{
char *s={"abcd"};
do {
printf("%d\n",++s);
} while(*s);
}
循环结束时指针s指向哪里?它是如何工作的?
在 C 中,零等价于false
。因此,当*s
指向字符串中的终止符(零)时,循环停止。
“abcd”以 5 个连续字节存储在内存中:'a' 'b' 'c' 'd' '\0'
.
最后一个字节零终止循环,因为零在 C 中为假。
首先,您不应该使用%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.
}