做者 : 陈宗权web
先说说双引号的字符串,好比"chenzongquan",它是由里面我们看到的一系列字符以及一个尾随的'\0'字符组成,存储在内存的只读存储区中。只读存储区是在整个程序运行期间都保留着的、可见的,并且其中的数据原则上是保持不变的。因此对一个双引号表示的字符串,只要你知道它的具体地址,能够在程序的任何一个函数中再次使用。数组
说到只读,要引一下,在16位系统中没有进行内存访问保护,因此在程序运行时实际上也能够改变只读存储区中的数据,可是在32位系统中有内存访问保护,程序运行时去改变只读存储区中的数据会引发异常。const的含义也是“只读”,不过这个只读只对编译器起做用,编译器能够在必定程度上经过语法检查避免对这种数据的修改操做。一旦程序运行起来,const是不起做用的。函数
再说说字符数组。字符数组是一组用来存放字符的空间。它的空间是可读写的。若是是全局变量,它会在整个程序运行期间一直保留;若是是局部变量,就只在它的做用域内存在。它本意是用来放一组字符,跟字符串没有必然的关系,可是因为历史缘由,它跟字符串纠缠不清了。spa
说说历史吧。在C语言中,基本数据类型没有字符串类型(其实C++/Java/C#的基本数据类型中也一样没有字符串,只不过它们都提供一个封装好的用于处理字符串的类型),可是程序中又常常要处理字符串,因此只好用字符数组来保存字符串了。字符数组做为数组要求有固定的长度,可是字符串长度又不必定,因此采起了用一个措施,就是在字符数组中用'\0'来表示字符串到此结束,同在这个字符数组中可是在'\0'后面的字符就不算是这个字符串的了。为了方便使用字符串,只要指定这个字符串的第一个字符的地址,经过它找到第一个字符,而后依次日后找就能找到第二个、第三个字符,以此类推,直到找到'\0'为止,也就走遍了整个字符串了,所以C语法中规定经过第一个字符的地址来引用字符串。在数组中,数组名就表示数组中第一个元素的地址,相应的,在字符数组中,数组名就表示数组中第一个字符的地址,所以也就常常用字符数组名来引用其中的字符串。指针
字符数组中保存的只是一组字符,只有其中有'\0'字符时才能够把这个字符数组当成字符串,因此字符数组未必都是字符串。orm
字符指针则是一个空间,用来保存地址,一个字符在内存中的地址,不保存字符。它原本跟字符串也没有什么牵扯,由于它保存的内容中根本连一个字符都没有,只是别处的某个字符的地址而已。可是一样因为上面说到的历史缘由,C语言中经过一个字符地址来引用字符串,因此每每经过字符指针来引用保存在内存中另外一个地方的字符串。字符指针独立存在是没有意义的,既然是保存另外一个地方的一个字符的地址的,必须真的在另外一个地方有一个字符,并且把它的地址保存到这个字符指针中以后,这个字符指针才开始有意义,才能用这个字符指针去引用另外一个字符或者以那个字符为首的字符串。blog