帮小弟我看一下这个有关问题,昨天接触C语言,今天接触指针,有点搞不明白这个咋回事呀-

帮我看一下这个问题,昨天接触C语言,今天接触指针,有点搞不明白这个怎么回事呀- -

int main(){
 char string[]="woaiwojia YuanCheng",stringb[30],*p1,*p2;

 p1=string,p2=stringb;
 printf("p1=%s",p1);//这里可以输出
 for(;*p1!='\0';p1++,p2++){
    *p2=*p1;
 }
   *p2='\0';
    printf("\np1=%s",p1);//为什么到了这里输出就没有东西了..  
                         //for循环stringb的时候有值. 这个是为什么呀
                         //我是一个新手,今天刚学c语言。。
                         //这个是关于指针的问题还是什么?

 return 0;
}

------解决方案--------------------
你的for循环里已经把指针p1的递增了n遍。
当循环结束,p1指向了字符串末尾的\0处。
此时你输出p1肯定为空啊。
------解决方案--------------------
p1初始指向字符数组string
在for循环中对p1自增,是p1指向的位置逐次向后移动,直到p1='\0'(string的末尾)
所以print p1相当于 print \0,当然为空
这段程序的是把string复制到stringb
输出stringb试一下

另外,看了lz之前的帖子,加油
------解决方案--------------------
引用:
Quote: 引用:

p1初始指向字符数组string
在for循环中对p1自增,是p1指向的位置逐次向后移动,直到p1='\0'(string的末尾)
所以print p1相当于 print \0,当然为空
这段程序的是把string复制到stringb
输出stringb试一下

另外,看了lz之前的帖子,加油

  谢谢哦,一起加油
 
int main(){
 char string[]="woaiwojia YuanCheng",stringb[30],*p1,*p2;
 
 p1=string,p2=stringb;
 printf("p1=%s",p1);//这里可以输出
 for(;*p1!='\0';p1++,p2++){
    *p2=*p1;
 }
   *p2='\0';
    int i;
  printf("\nstringb=%s\n",stringb);//这个输出没问题,能理解
    int i;
    printf("stringb[i]=");
    for(i=0;i<23;i++){
    printf("%c",stringb[i]);//这个输出没问题,能理解
    }
    printf("\np1[i]=");
    p1=string,p2=stringb;//在这里将指针复位
    for(i=0;i<23;i++){
    printf("%c",p1[i]);//这个输出好多乱码;
    }
    printf("\np2[i]=");
    for(i=0;i<31;i++){
    printf("%c",p2[i]);//这个输出前边会有几个乱码, 后边会把那句话全部正常输出...
    }
 
 return 0;
}

运行结果..
帮小弟我看一下这个有关问题,昨天接触C语言,今天接触指针,有点搞不明白这个咋回事呀-
麻烦您能告诉我为什么会这样啊 ...

复制完后指针的值改变了,要将指针的值变回原来的位置
------解决方案--------------------
int main(){
 char string[]="woaiwojia YuanCheng",stringb[30],*p1,*p2;
  
 p1=string,p2=stringb;
 printf("p1=%s",p1);//这里可以输出
 for(;*p1!='\0';p1++,p2++){
    *p2=*p1;
 }
   *p2='\0';
    int i;
  printf("\nstringb=%s\n",stringb);//这个输出没问题,能理解
    int i;//这里重复定义了变量i啊,你编译没报错吗?
    printf("stringb[i]=");
    for(i=0;i<23;i++){
    printf("%c",stringb[i]);//这个输出是有问题的,string只有19位,stringb有30未,stringb[19]后的
    }                       //都乱码
    printf("\np1[i]=");
    for(i=0;i<23;i++){
    printf("%c",p1[i]);//p1++等价于p1=p1+1,上面的for循环结束后,p1已经指向字符串末尾了
    } //而p[i]等价于p+i,指向的是内存中字符串string之后的空间,那里没有字符数据,自然乱码了
    printf("\np2[i]=");
    for(i=0;i<31;i++){
    printf("%c",p2[i]);//配合下图,p2指向的空间在p1之前,p2[i]在i递增的过程中经过了p1的内存空间
    } //就把p1中的字符串输出来了。
  
 return 0;
}


帮小弟我看一下这个有关问题,昨天接触C语言,今天接触指针,有点搞不明白这个咋回事呀-

你调试时中断查看一下内存就可以清楚地了解问题所在了。
希望能帮到你。
------解决方案--------------------
看了个大概 感觉楼主还是没完全明白你第一次提出来的代码自己错在哪里
另外你的代码风格有点乱 建议多参考别人的代码风格
自己先想明白你第一次提问的代码有什么问题再回头来看第二次提问的代码吧