首先,ps是个char指针
*ps是指针指向的其中一个字符
while(*ps)就是判断字符ascii不为0,等价于不是'\0'
那么一通循环++过后,ps现在指向字符串结尾了
当for循环开始时,先执行ps--,让它指向最后一个字符,就是z
执行print("%s",ps);是打印字符串,从当前字符一直打印到字符串结尾,那么其实就是z
继续循环,ps--,它指向y了,那么打印出来的是yz
再继续循环,打印xyz
此时ps-str=0,再ps--,ps-str=-1,循环结束
那么一共打印了3次,中间没有换行,连在一起就是zyzxyz
#include<stdio.h>
void main()
{
char str[]="xyz",*ps=str;
while(*ps)
ps++;//在while循环内部,由于字符串末位为‘\0’,退出循环时ps指向'\0'
for(ps--;ps-str>=0;ps--)//第一个ps--只在刚进入循环时运行,初始化循环中的ps指向z;第二个ps--每次循环结束运行,表示向前移动。
printf("%s",ps);//进入for循环,第一次ps指向z,输出z;第二次ps指向y,输出yz;第三次指向x,输出xyz。
//注:%s需要输出到'\0'才会停止,所以每次都要将指向后面的字符都输出出来
}
下面是我的理解,供参考:
#include <stdio.h>
int main(void){
char str[] = "xyz",*ps=str;
while(*ps){ //当ps指向的不为空字符串'\0'时,结束循环,否则,每次让ps往后移动字符
ps++;
}
//循环结束,ps指向str后面的空字符'\0'
//ps开始和迭代都是往前移动一个字符,循环结束条件是当ps指向str开头前一个字符时结束循环
//首先ps指向str后面的空字符,ps--一次后,指向'z'字符,所以第一次循环打印"z",
// 然后迭代时ps又往前移动一个字符 ,即'y',所以按%s打印 ,即打印'y'字符到空字符结束, 即"yz"
//然后ps再次迭代,又往前移动一个字符,指向'x',同理按%s打印,打印出"xyz",
//最后ps进行最后一次迭代,再次往前移动一个字符的位置,到了str指针的前面,此时ps-str<0,循环结束。
//所以,所有打印的结果连起来就是"zyzxyz".
for(ps--;ps-str>=0;ps--){
// printf("ps=%d,str=%d\n",ps,str);
printf("%s\n",ps) ; //打印ps指向的字符直到空字符,即%s的字符打印
}
// printf("ps=%d,str=%d\n",ps,str);
return 0;
}