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

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: 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; }    你调试时中断查看一下内存就可以清楚地了解问题所在了。 希望能帮到你。

user: user-3
content: 看了个大概 感觉楼主还是没完全明白你第一次提出来的代码自己错在哪里 另外你的代码风格有点乱 建议多参考别人的代码风格 自己先想明白你第一次提问的代码有什么问题再回头来看第二次提问的代码吧

user: user-0
content: 引用 1 楼 catonmoon 的回复:你的for循环里已经把指针p1的递增了n遍。 当循环结束，p1指向了字符串末尾的\0处。 此时你输出p1肯定为空啊。 谢谢您的回复   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]=");     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; }  运行结果..  麻烦您能告诉我为什么会这样啊 ...

user: user-0
content: 引用 2 楼 a345485527 的回复: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]=");     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; }  运行结果..  麻烦您能告诉我为什么会这样啊 ...

user: user-4
content: 引用 3 楼 u010556068 的回复:[quote=引用 2 楼 a345485527 的回复:] 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]=");     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; }  运行结果..  麻烦您能告诉我为什么会这样啊 ...[/quote] #include<stdio.h> #include<string.h>  int main() { 	char string[] = "woaiwojia YuanCheng", stringb[30] = {0}, *p1, *p2; 	int i; 	 	p1 = string,p2 = stringb; 	 	printf("p1=%s", p1); 	for(;*p1!='\0';p1++,p2++) 	{ 		*p2 = *p1; 	} 	*p2='\0'; 	 	printf("\nstringb=%s\n",stringb); 	 	printf("stringb[i]=");      	for(i = 0;i < strlen(stringb);i++) 	{ 		printf("%c", stringb[i]);     }     printf("\np1[i]=");     p1 = string, p2 = stringb;//ÔÚÕâÀï½«Ö¸Õë¸´Î»     for(i = 0;i<strlen(string);i++) 	{ 		printf("%c",p1[i]);     }     printf("\np2[i]=");     for(i=0;i<strlen(stringb);i++) 	{ 		printf("%c",p2[i]);     }     return 0; } /*我把代码修改了一下，不会的再问我

user: user-4
content: 引用 3 楼 u010556068 的回复:[quote=引用 2 楼 a345485527 的回复:] 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; }  运行结果..  麻烦您能告诉我为什么会这样啊 ...[/quote] 复制完后指针的值改变了，要将指针的值变回原来的位置

user: user-5
content: 引用 4 楼 u010556068 的回复:[quote=引用 1 楼 catonmoon 的回复:] 你的for循环里已经把指针p1的递增了n遍。 当循环结束，p1指向了字符串末尾的\0处。 此时你输出p1肯定为空啊。 谢谢您的回复   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]=");     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; }  运行结果..  麻烦您能告诉我为什么会这样啊 ...[/quote]  后面两个不正常，还是指针问题呀，，，P1,P2都是指针，，指的地址内容不确定，就乱了

user: user-6
content: p1初始指向字符数组string 在for循环中对p1自增，是p1指向的位置逐次向后移动，直到p1='\0'(string的末尾) 所以print p1相当于 print \0，当然为空 这段程序的是把string复制到stringb 输出stringb试一下  另外，看了lz之前的帖子，加油

user: user-2
content: 你的for循环里已经把指针p1的递增了n遍。 当循环结束，p1指向了字符串末尾的\0处。 此时你输出p1肯定为空啊。