文档章节

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

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
03/06
7
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 懒床是对冬天最起码的尊重

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享daniwellP/桃音モモ的单曲《Nyan Cat》 《Nyan Cat》- daniwellP/桃音モモ 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪...

小小编辑
31分钟前
5
0
码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
3
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部