字符指针,字符数组,双引号的字符串的区别与联系

作者 :  陈宗权

       先说说双引号的字符串,比如"chenzongquan",它是由里面咱们看到的一系列字符以及一个尾随的'\0'字符组成,存储在内存的只读存储区中。只读存储区是在整个程序运行期间都保留着的、可见的,而且其中的数据原则上是保持不变的。所以对一个双引号表示的字符串,只要你知道它的具体地址,可以在程序的任何一个函数中再次使用。

 

    说到只读,要引一下,在16位系统中没有进行内存访问保护,所以在程序运行时实际上也可以改变只读存储区中的数据,但是在32位系统中有内存访问保护,程序运行时去改变只读存储区中的数据会引起异常。const的含义也是“只读”,不过这个只读只对编译器起作用,编译器可以在一定程度上通过语法检查避免对这种数据的修改操作。一旦程序运行起来,const是不起作用的。

 

    再说说字符数组。字符数组是一组用来存放字符的空间。它的空间是可读写的。如果是全局变量,它会在整个程序运行期间一直保留;如果是局部变量,就只在它的作用域内存在。它本意是用来放一组字符,跟字符串没有必然的关系,但是由于历史原因,它跟字符串纠缠不清了。

 

    说说历史吧。在C语言中,基本数据类型没有字符串类型(其实C++/Java/C#的基本数据类型中也同样没有字符串,只不过它们都提供一个封装好的用于处理字符串的类型),但是程序中又经常要处理字符串,所以只好用字符数组来保存字符串了。字符数组作为数组要求有固定的长度,但是字符串长度又不一定,所以采取了用一个措施,就是在字符数组中用'\0'来表示字符串到此结束,同在这个字符数组中但是在'\0'后面的字符就不算是这个字符串的了。为了方便使用字符串,只要指定这个字符串的第一个字符的地址,通过它找到第一个字符,然后依次往后找就能找到第二个、第三个字符,以此类推,直到找到'\0'为止,也就走遍了整个字符串了,因此C语法中规定通过第一个字符的地址来引用字符串。在数组中,数组名就表示数组中第一个元素的地址,相应的,在字符数组中,数组名就表示数组中第一个字符的地址,因此也就经常用字符数组名来引用其中的字符串。

 

    字符数组中保存的只是一组字符,只有其中有'\0'字符时才可以把这个字符数组当成字符串,所以字符数组未必都是字符串。

 

    字符指针则是一个空间,用来保存地址,一个字符在内存中的地址,不保存字符。它本来跟字符串也没有什么牵扯,因为它保存的内容中根本连一个字符都没有,只是别处的某个字符的地址而已。但是同样由于上面说到的历史原因,C语言中通过一个字符地址来引用字符串,所以往往通过字符指针来引用保存在内存中另一个地方的字符串。字符指针独立存在是没有意义的,既然是保存另一个地方的一个字符的地址的,必须真的在另一个地方有一个字符,而且把它的地址保存到这个字符指针中之后,这个字符指针才开始有意义,才能用这个字符指针去引用另一个字符或者以那个字符为首的字符串。

转载于:https://my.oschina.net/u/2379244/blog/466300

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值