C++中char* str与char str[]的区别

昨天写程序,犯了一个比较幼稚的问题,就是混淆了char* str与char str[]的区分,经过代码test和查阅,终于弄明白了区别,在这里分享给大家这个区别和过程。在定义的时候,其实char* s1与char s2[]是有很大区别的。s1这个指针其实是指向一段常量字符串,存储在静态储存区,这段字符串是只读的,不能被修改。然而,s2这只是个局部变量数组,在定义它的时候,有两份备份,一份存储在stack上,一份存储在静态存储区,所以可以被修改。

举个例子,假如我定义了一个函数,返回的是char*的类型变量,当这个函数运行结束时,所定义的字符串在静态存储区,并不会消亡,当整个程序结束时,才会消亡。如下图所示,我有返回char*的str()函数。


如上图所示,我赋给的字符串值为“aaaa”,从而,这串aaaa也就存储在静态存储区上了。挡在main函数中调用这个函数的时候


输出结果是


结果没有任何问题,这说明,在str()函数运行结束时,字符串aaaa还是存在的。

这时,如果我们换一个函数,如下图:


在这个函数中,我定义了一个局部变量char数组,赋值依然是aaaa。在main函数中调用这个函数。


运行结果为:


我们从结果来看,所返回的指针为一串乱码,这是因为char s1[]定以后,在程序中有两份拷贝,一份在静态存储区中,一份在stack中,当str1()函数运行退出时,stack要被清空,从而内存也就被清空了,返回的是一个被释放的内存地址,所以打印出来也就是一段乱码了。

从上面的例子中可以得到两种指针的本质区别。另外还有一个例子可以验证。


在这个例子中,我定义了四个指针,两个char*指向同一个字符串,由于该字符串存储在静态储存空间里面,所以他们所指向的地址是一样的。同时我又定义了两个char[]类型的指针,他们两个也指向一串相同的字符串,由于这个字符串有备份,所以,s3和s4是不相同的。从下面运行结果,我们可以看出:


通过上面两个例子的讲解,我想大家对于char*和char[]数组定义的指针有了一定的了解,这虽然是个很小的问题,但是容易让很多人迷糊,涉及到变量空间的存储问题。另外,祝大家晚安,有个好梦,呵呵。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值