文档章节

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

J
 Jacob_zs
发布于 2015/06/13 10:16
字数 1077
阅读 198
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

java基础知识,小栗子

来操作一下数组.....注意带参数的变长数组的使用. package com.avatus;import java.util.Random;import java.util.Scanner;public class Main { public static void main(St...

Oh_really
15分钟前
0
0
SSO单点登录PHP简单版

  前面做了一个新项目,需要用户资源可以需要共享。由于之前没有做过这样的东西,回家之后,立马网站百度“单点登录”。帖子很多,甄别之后,这里列几篇认为比较有营养。   http://blog...

slagga
53分钟前
2
0
Java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1 概述 泛型在j...

hensemlee
56分钟前
2
0
Annotation注解详细介绍

目录介绍 1.Annotation库的简单介绍 2.@Nullable和@NonNull 3.资源类型注释 4.类型定义注释 5.线程注释 6.RGB颜色纸注释 7.值范围注释 8.权限注释 9.重写函数注释 10.返回值注释 11.@Keep注释...

潇湘剑雨
58分钟前
2
0
一步步编写自己的PHP爬取代理IP项目(二)

这一章节我们正式开展我们的爬虫项目,首先我们先要知道哪个网站能获取到免费代理IP,目前比较火的有西刺代理,快代理等,这里我们拿西刺代理作为例子。 这里就是一个个免费的IP地址以及各自...

NateHuang
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部