while(*p2++ = *p1++)的问题

ren_jerk 2011-05-22 10:09:05
#include<stdio.h>

int main()
{
char *p1 = "name";
char *p2;
p2 = (char *)malloc(20);
memset(p2,0,20);
while(*p2++ = *p1++){

}
printf("%s\n",p2);
}
输出为空串。
请大虾解释while(*p2++ = *p1++)的详细执行过程。
...全文
656 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gary_Hendrix 2011-05-23
  • 打赏
  • 举报
回复
优先级问题
陈思有 2011-05-23
  • 打赏
  • 举报
回复
#include<stdio.h>

int main()
{
char *p1 = "name";
char *p2;
p2 = (char *)malloc(20);
memset(p2,0,20);
while(*p2++ = *p1++){/*0是NUL('\0')的ASCALL值,即你将字符串p2的前20个字节初始化为'\0'*/
}
printf("%s\n",p2);
free( p2 ) /*动态分配的内存一定要释放,否则会造成内存泄漏*/
}
booksoon 2011-05-23
  • 打赏
  • 举报
回复
这样的代码不出现最好~~~
赵4老师 2011-05-23
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
zhouganghao 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bingyu2046 的回复:]

楼主的循环执行完,p2指向的是字符串末尾,打印自然为空了,因为你每次*p2++都改变了p2的值
[/Quote]
+1
ren_jerk 2011-05-23
  • 打赏
  • 举报
回复
感谢楼上的各位大虾了,感激不尽啊。抱着试试的态度发帖,竟然有这么多详细回复。感动.
如此美丽的你 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ljt3969636 的回复:]
*p2= *p1
p1=p1+1;
p2=p2+1;
[/Quote]
++++++++++++++++++++
如此美丽的你 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ljt3969636 的回复:]
C/C++ code

char *p1 = "name";
char *p2;

p2 = (char *)malloc(20);
memset(p2,0,20);
char *p3=p2;//指向原来的p2
while(*p2++ = *p1++){

}
printf("%s\n",p3);

……
[/Quote]
++
bingyu2046 2011-05-22
  • 打赏
  • 举报
回复
楼主的循环执行完,p2指向的是字符串末尾,打印自然为空了,因为你每次*p2++都改变了p2的值
Ever_lover 2011-05-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hiroyukki 的回复:]
1. char tmp = *p1;
2. *p2 = tmp;
3. p1++;
4. p2++;
[/Quote]
++
AnYidan 2011-05-22
  • 打赏
  • 举报
回复
*p2++
* 和 ++ 的优先级 相同, 但结合率是从右到左,
*p2++ = *(p++)
由于 后置++, p 的值在下一句才自增,因此上句是两句:*p; p++;

而字符串 以 \0 结尾,在数值上 = 0,可以结束 while 循环
漫步者、 2011-05-22
  • 打赏
  • 举报
回复


#include<stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
char *p1 = "name";
char *p2;
char *pTemp;
p2 = (char *)malloc(sizeof(char)*20);
pTemp=p2;
memset(p2,0,20);
while(*p2++ = *p1++){//当p1=p2='\0';跳出循环,此时这个未就是p2的开始位置
//所以是空
}
printf("%s\n",pTemp);
//要注意的是动态申请空间得要释放掉;
free(pTemp);
return 0;
}

ljt3969636 2011-05-22
  • 打赏
  • 举报
回复
*p2= *p1
p1=p1+1;
p2=p2+1;
ljt3969636 2011-05-22
  • 打赏
  • 举报
回复

char *p1 = "name";
char *p2;

p2 = (char *)malloc(20);
memset(p2,0,20);
char *p3=p2;//指向原来的p2
while(*p2++ = *p1++){

}
printf("%s\n",p3);
贪食蛇男 2011-05-22
  • 打赏
  • 举报
回复
1. char tmp = *p1;
2. *p2 = tmp;
3. p1++;
4. p2++;

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧