C++,为什么字符串可以赋值给const char* 类型的数据,而不能给char* 类型的数据赋值。

先来看三组代码:

                            1.const char *name1 = "Levitt";//正确

                            2.char *name2 = "Levitt";//报错

                            3.char name3[] ="Levitt";//正确

 

对于这种现象,我百思不得其解,后来请教了我们班的著名大佬老陈。最后得出了结论(当然也有可能结论有错,望广大网友指正)

                ① 为什么1正确而2报错,这是因为1这行代码的等号右边,也就是"Levitt"这行字符串,是存储在静态区的。

    静态区存储的是常量,如果把"levitt"看作是一个整体,那它本身也是字符串的名称,字符串就是字符数组,数组的名称即指向这个数组的地址(同时也是这个数组第一个元素的地址,第一个元素是char型,所以用char*没错)。因此1行代码的操作也就是把静态区"levitt"这行字符串的地址赋值给了指针name1,前面提到"Levitt"是存储在静态区的,自然不可改变,那么指向"Levitt"的指针自然也必须是const型,结合起来,就是const char*。

为什么3正确,因为3此时并不是取地址操作了,而是相当于一个拷贝的操作,把静态区的"Levitt"拷贝了一份到栈区,取名叫name3(同时name3也是它的地址),所以此时"levitt"这行字符串会存在栈区之中,但是静态区的"Levitt"会不会被释放掉呢?我目前还不知道。

 

另外还有一点,如果在最开始声明字符数组时没有初始化,后面就只能一个一个的赋值了,或者用strcpy函数。例如char name[50] ;  *name="Levitt";//报错

  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值