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

#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怎么理解呢?它和二级指针有什么区别呢?这段代码的内存四区图是怎样的?


gd5178
浏览 1352回答 2
2回答

onemoo

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来输出了。所以例子中将它们俩复制了一份。

gd5178

谢谢,回答的很详细,一看就理解了。
打开App,查看更多内容
随时随地看视频慕课网APP