字符串与字符数组的区别

首先需要先了解\0的概念。

\0的概念

\0是c语言中的字符串结束符,在ASCII字符集中对应空字符NULL,它虽然不计入串长,==但要占内存空间!==

可见\0是作为字符串结尾的一个标识符,也即当编译器碰到\0时才会认为到达了这个字符串的结尾,==如果一直没碰到\0,编译器就一直找一直找,直到找到一个\0为止!==

字符串的概念

首先从内存角度上来看,字符串就是一段连续的内存,但该段内存中的内容符合如下两个特点:

  1. 该段内存中的最后一个字节必然为\0
  2. 该段内存中除了最后一个字节为\0,其余字节均不为\0,也即有且仅有一个\0

所以给这样一段符合上述两个特点的内存取了一个名字,叫“字符串”,同时该段内存中的内容一般都是可见字符,也即可打印字符,所以便可用%s进行打印,所打印出的内容为该段内存除最后一个字节\0的所有内容,也即\0之前的所有内容。

字符数组的概念

首先数组也即是一段连续的内存,字符数组显然也是一段连续的内存,但该段内存中的内容符合如下一个特点:

  1. 该段内存中的内容都为字符

所以给这样一段符合上述特点的内存取了一个名字,叫“字符数组”,意思这个数组中的元素都是字符,同样的若元素都是数字,则相应的叫做“数字数组”。

字符串与字符数组的区别

由上可见,只要是符合相应的要求内存便可相应的叫做“字符串”或“字符数组”。

也即只要内存中的内容都为字符便可称作“字符数组”,而\0显然也是能算作是字符,==所以字符串也能算是一种特殊的字符数组==,但字符串与字符数组的概念经常容易混淆也是因为这个原因。

由上可见,字符串中有且仅有一个\0,且该\0必然是内存中的最后一个字节,而在字符数组中也可以存在\0,最关键的为\0的个数可以为0个、1个、2个……,\0的位置可以为第一位、第二位、第三位……

这样当字符数组中正巧只存在一个\0,且正巧又处于该段内存中的最后一个字节位置,该字符数组就又可以叫做字符串了,且只有上面这种情况时字符数组就才能叫做字符串,其余情况下字符数组就只能叫做字符数组。

==也即一段连续的内存,如果该段内存中的内容有且仅有一个\0,且该\0是该段内存中的最后一个字节,该段内存就叫做“字符串”,否则就叫做“字符数组”,同时即使是叫做“字符串”,也可称为是“特殊的字符数组”。==

注:

  1. 特别需要注意的是,如果字符数组中不存在\0时,用%s打印该数组,编译器便会因为找不到\0而一直找一直找,最后超出了数组的范围,造成内存泄漏
  2. 同时若字符串中的字符个数为n,那该字符串的长度至少为 n+1,因为需要多一位来存储“\0”。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值