C++学习中的一点笔记(一)

本文探讨了C++中数组名和指针在strcpy函数中的使用,解释了为什么数组不能直接赋值给数组,以及st=test问题的根源。通过分析,指出数组名作为常量地址不能等同于另一个常量地址,而指针变量可以存储不同的地址,因此stry.str = st这样的操作是允许的。
摘要由CSDN通过智能技术生成
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是正确的) 是正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值