用while循环输出完了指针后,再用for循环输出指针怎么成了乱码了?

#include
#include
#include
int main()
{
int i,k;
char st[] = "asdfghjkl";
char *p = &st[0] ;
k = strlen(st);

while(*p!='\0')
{
     printf("p = %c\n",*p);
     *p++;
 }
 printf("\n");
 printf("123%c123\n",*p);
 p = NULL;
 p = &st[0];
 for(i = 0;i<=k;i++)
 {
      printf("%c\n",p[i]);
  }
return 0 ;

}

如果把p=NULL;
p = &st[0];
删除之后后面的输出就会成为乱码,这个怎么解决?

3个回答

因为在你的while()循环里面p已经移动了,现在p指向了‘\0’的位置。所以在你的 printf("123%c123\n",*p)这一句实际上输出的是空字符,也就是''\0'
必须将p的指向重新指向字符串的起始地址 ,才能进行for()语句的输出,即需要添加p=stu。也就是你所写的p=&stu[0]

yongheng_1999
yongheng_1999 回复qq_31407743: 其实只要理解指针的移动概念就不会出错的。while()循环里面用了*p++;所以每执行一次while()之后p就自加,而你下面要用到重新输出该字符串,所以必须让指针重新指向该字符串的起始位置才能输出嘛。至于whiel()和for()两种方式本质上没有太大的区别的,都是可以用来输出指针对象的。关键是要理解指针。最好自己一步步调试下,加深理解指针的指向位置。
大约 4 年之前 回复
qq_31407743
早上无叶花 那不能用了while之后就放弃这个指针了吧?以后要用怎么办,只能用p=st来重新调整指针指向?还是说以后都不要用到while循环来输出指针了?
大约 4 年之前 回复

p = &st[0];
的作用就是把p指向字符串第一个位置;
你把它删了,p,就指向st字符串后的地址位置;
而这些位置内容是不确定的[如果你去调试,会发现是p的定义];
对于printf来说,它不是合法的字符,显示为乱码。

这个删了除非你不再用p来输出,否则乱码是正常的,应为你在前面已经移动指针到末尾了。

立即提问