用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];
删除之后后面的输出就会成为乱码,这个怎么解决?

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

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

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