C++, weird behavior about copying char arrays by using pointers -


i got code textbook:

#include <iostream> using namespace std; int main(){     char str1[]="hello,world!", str2[20], *p1, *p2;     p1=str1; p2=str2;     /*     for(;*p1!='\0';p1++,p2++){       cout<<"p1="<<*p1<<endl;       *p2=*p1;cout<<"p2="<<*p2<<endl;     }     *p2='\0';     p1=str1; p2=str2;     */        cout<<"p1="<<p1<<endl;     cout<< "p2="<<p2<<endl;        return 0; } 

i ran code, output p1=hello,world!p2= can understand.

but if uncomment loop, output shows here got confused, why after loop, why shows p1= instead of showing p1=hello,world!, , pointer p2, after assignment in loop, still shows p2=?

but after uncomment p1=str1; p2=str2; line, output p1=hello,world!, p2=hello,world!, why works that?

and what's reason writing line *p2='\0';, doesn't matter line commented out or not, previous outputs don't change.

can tell me how char pointer here working?

the code copying str1 str2.

in c++, '\0' used end string. when try print char pointer (say ptr), compiler prints string starting *ptr (the character pointed pointer). when compiler finds '\0', stops printing.

in beginning, p1 points first char of str1 , p2 points first char of str2. if print them without doing else, compiler print both strings out completely. output p1=hello,world!p2=.

the loop makes p1 , p2 advance through str1 , str2. @ end, p1 points \0 @ end of str1 , p2 points '\0' @ end of str2. if print p1 or p2 directly after loop ends, compiler find '\0' , stop printing. so, output p1=p2=.

uncommenting p1=str1; p2=str2; make both strings point first characters again, printing them cause whole string printed. output p1=hello,world!p2=hello,world! (because str1 got copied str2 in loop).

the *p2 = '\0' ending str2 '\0'. if code works without line, means compiler initialized characters of str2 '\0' automatically. however, compiler isn't guaranteed that, should terminate strings '\0' in programs.


Comments