字符复制函数strcpy中*s++的理解

2018-12-12 08:48:00    六月    803    转贴: https://blog.csdn.net/polar9527/article/details/39158807?locationNum=51

strcpy函数中出现的方式

一、
 while(*s++=*t++); 
二、    
  while((*t)   !=  '\0';){   
          *s   =   *t;   
          s++;   
          t++;   
  }

两者不完全等价!

while(*s++=*t++);   是先赋值*t-->*s,然后s++,t++,最后将*s的值作为判断条件。
    
  while((*t)  !=  '\0'){   先拿*t的值作为判断条件
          *s  =  *t;    //再赋值
          s++;           //最后 自增
          t++;  
  }


想想执行完的结果: 假如是字符串的拷贝,那么
(1)前者肯定将'\0'赋给*s了,而后者没有;
(2)退出循环时,前者的s和t都指向

'\0'

的后一个位置;而后者的t指向‘’,s与t同步,但没有获得‘’
(3)若在其后加上一句prinf("%sn",s); 前者输出没有问题,后者输出可能出现问题(除非之前对s的每个位置都置0)

*s = '\0';


while(*s++=*t++)
这里实现了四个操作。
1 *s = *t, 即将s指向内存赋值为t指向内存的值;
2 执行s的自加操作;
3 执行t的自加操作;
4 判断执行自加前的*s值,如果*s为0,那么退出循环。
可以写成等价的 for循环
for(; *s; s++, t++)
   *s = *t;

=============================================

C语言中(*s++)、s++、*s++、(*s)++之间有什么区别

(*s++)   得到s指向位置的值,将该值作为表达式的结果,然后s指针往后偏移
s++       s指针往后偏移
*s++      得到s指向位置的值,将该值作为表达式的结果,然后s指针往后偏移。和第一个一样。
(*s)++    得到s指向位置的值,然后将该值做自加,新值作为表达式的结果值

前面3处的++都是作用在指针上,也就是 地址
最后1个++是作用在指针指向地址上的 数值




浙ICP备16026228号
蝉知7.0.1