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
Post a Comment