#include <iostream>
using namespace std;
char * stringcat(const char *s1,const char *s2);
void main(){
char *c;
const char *a = "i love ",*b="you";
c=stringcat(a,b);
cout<<c<<endl;
delete [] c;
}
char * stringcat(const char *s1,const char *s2){
char*p,*p0;//p用于存储拼接后的字符串,p0备用
p=new char[strlen(s1)+strlen(s2)+1];//使用new为p申请恰好的堆空间
if(p==NULL){//检测是否申请空间成功
cout<<"Out of space!"<<endl;
}
p0=p;//让P0指向P
while(*s1){//s1中的元素不为'\0'时继续遍历
*p++=*s1++;//将p的元素用s1元素挨个填充
}
while(*s2){
*p++=*s2++;
}
*p='\0';//尾部加上结束符
return p0;//返回p0
}
疑难点1:*p++=*s1++
*p的首地址首先被s1的首地址赋值,然后 *p++就是走向p的下一个元素的地址,*s1++同理,然后继续赋值,直到s1到结束符
疑难点2:return p0
p0指向p的首地址,所以p0的内容和p是一样的,但是p最后指向了结束符,所以返回p就是返回结束符,最后会溢出!