struct stringy
{
char * str;
int ct;
};
void Set(stringy &str,const char * test);
void Set(stringy &stry, const char * test)
{
char *st = new char[strlen(test)];
strcpy(st,test);//这里只能使用strcpy;
stry.str = st;//这里也可以用 strcpy(stry.str,st);
stry.ct = strlen(test);
}
int main()
{
stringy beany;
char testing[] = "Reality isn't what is used to be.";
Set(beany,testing);
}
新手学习c++的一点笔记。
在学c++primer 的时候做到此题 。
要求set函数new一个数组,然后将test数组复制给new的数组,再把stringy结构中的str指向new的数组。
下意识就这样写了:
st = test;
stry.str = st;
很明显第一行错误,数组不能赋值给数组。
首先看第一行:
前面有学到数组复制有专门的函数strcpy(st,test),但是为什么第二行又是正确的?
stry.str的定义是 char * str ,st的定义是char * st = new char[];
这里我认为这两个都是数组,实际上char * str定义的是指向数组的指针,所以stry.srt = st 是将这一指针指向了st数组。
这是一个低级错误,很容易就解决了。
但是我又试了下发现第二行可以用strcpy。
strcpy(stry.str,st)这样写也是可行的。
原来strcpy还可以用指针做参数,我去查了一下strcpy的实现,strcpy的两个参数是两个地址,把从src地址开始且含有'\0'结束符的字符串复制到以dst开始的地址空间。
数组名就是该数组存放在内存中的地址,指针的值也是所指向位置的地址。所以二者都可以作为strcpy的参数。
回过头来又想想为什么数组不能赋值给数组呢?
st=test问题出在哪里?
st和test都是数组名,前面说了数组名的值是数组所在位置的地址。而数组的地址是一个常量, 常量 = 常量(就像3=3是错误的一样) 的表达式肯定是错误的。
而stry.str = st 是正确的,因为stry.str是一个指针,而指针是一个变量,它存放的地址是可以变化的。 变量 = 常量(x=3是正确的) 是正确的。