文档章节

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

J
 Jacob_zs
发布于 2015/06/13 10:16
字数 1077
阅读 201
收藏 5

作者 :  陈宗权

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

 

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

 

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

 

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

 

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

 

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

本文转载自:http://blog.renren.com/share/226124099/11850349578

共有 人打赏支持
J
粉丝 1
博文 7
码字总数 1407
作品 0
中山
私信 提问
C语言中的字符串

1.字符串与字符数组 字符数组是一种数组,这中数组中的每个元素是一个字符型数据。 定义一个字符数组: 对已定义的字符数组进行赋值: 以上字符素组的存储为: 字符数组的初始化有两种方式:...

大道无名
2016/10/22
10
0
C语言字符串总领

字符串(character string)是一个或多个字符的序列。 双引号不是字符串的一部分。双引号告知编译器它括起来的是字符串。C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数...

狐狈筱筱生
2017/12/04
0
0
C Primer Plus 第11章 字符串和字符串函数 11.1字符串表示和字符串I/O

当然,最基本的您已经知道了:字符串(character string)是以空字符(o)结尾的char数组。因此,您所学的数组和指针就可以用在字符串上。但是由于字符串的使用非常广泛,C提供了很多专为字符...

idreamo
2016/08/17
22
0
C Primer Plus 第11章 字符串和字符串函数 11.3 字符串输出

11.3.1 puts( )函数 puts( )函数的使用很简单,只需要给出字符串参数的地址。程序清单11.8列出了输出字符串的多种方式。 程序清单11.8 put_out.c程序 输出如下: 注意,每个字符串都单行显示...

idreamo
2016/08/19
11
0
Shell脚本入门-2

(一)定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名...

Avner
2018/03/06
7
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部