为了账号安全,请及时绑定邮箱和手机立即绑定

指针技术问题理解不清楚,请大神解答一下

指针技术问题理解不清楚,请大神解答一下

C++
gd5178 2015-07-31 00:18:50
#include <iostream>#include <stdlib.h>using namespace std;int copy_str(char*from,char*to){ char*tmpfrom=from; char*tmpto=to; while (*tmpto++=*tmpfrom++)    //向分配的内存拷字符串 { ; } cout<<*from<<endl; cout<<from<<endl; cout<<*to<<endl; cout<<to<<endl; return 0;}int main(){ char*from="abcde"; char buf[100]; copy_str(from,buf); cout<<buf<<endl; system("pause");return 0;}输出显示  :  a                  abcd              a              abcd              abcd   我想问一下,为什么输出 *from 和 *to 显示a,而输出 from 和 to 显示 abcd呢? 这里的辅助指针 char*tmpform和char*tmpto怎么理解呢?它和二级指针有什么区别呢?这段代码的内存四区图是怎样的?
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

from和to是char指针,*from解引用后就成了char。

在传参数时传入from的是"abcd"这个字符串,所以from指向的是这串字符中的第一个a,那*from就是a这个字符,所以cout输出a。

也因为from是指向字符的指针,所以cout会按照字符串来输出from,这样第二个cout就输出了abcd。

to和*to是同样的道理。

tmpfrom 和 tmpto 没什么特别的,就是把from和to指针复制了一份,用这个两个指针的副本在while中操作。while的条件判断表达式是一种常见的复制字符串写法。具体解释如下:取地址*和自增++是右结合的,所以*tmpfrom++会先进行后置自增,这里又用到了后置自增的特点:先取tmpfrom的当前值,再将tmpfrom自增(也就是指向后面的字符),这样就取出了tmpfrom当前的指向,解引用后得到当前所指的字符,且在表达式结束后tmpfrom也会指向下一个字符。等号前面的to也是同样的道理。于是每次while进入判断时就将tmpfrom所指的字符复制到了tmpto所指的位置,而下一次判断前这两个指针又都指向了下一个位置,这样循环复制,直到又一次while开始时,from指向了它字符串最后的'\0',将这个'\0'复制给*tmpto后——你要知道,赋值表达式的值就是等号左面的值——所以这一次整个*tmpto++=*tmpfrom++表达式为'\0',在判断中会被视为false,故while循环结束,同时也就完成了字符串的复制。这种写法不需要在while的循环体中写代码,只用条件判断表达式就能完成任务。

所以这里其实不用复制一份指针,直接在while中用from和to也是可以的。只不过在while结束后,from和to就指到了两个字符串的末尾的后一位,这样就不能用from和to来输出了。所以例子中将它们俩复制了一份。

查看完整回答
反对 回复 2015-07-31
?
gd5178

TA贡献1条经验 获得超0个赞

谢谢,回答的很详细,一看就理解了。

查看完整回答
反对 回复 2015-07-31
  • 2 回答
  • 0 关注
  • 1350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信