C语言中的字符串

47 阅读2分钟

多数人学习编程都是从C语言开始,因为学习C语言可以帮助初学者打下坚实的基础,包括对数据结构的理解,算法、计算机基础的理解;以便于在以后学某一门需求广泛的上层语言时(如:Java),可以事半功倍。

C语言中的字符串

首先我们必须清楚,C语言本身并没有“字符串”这种数据类型。通常用一个字符数组来存放一个字符串。字符串与普通字符数组的区别是:字符串的末尾有一个空字符'\0'

C语言中字符串通常的声明方式如下:

char sa[] =  "Hello world!";
//通过这种方式来声明字符串,编译器会自动在字符数组末尾加上'\0',用来区别字符串和普通字符数组

在C语言中,数组名代表的就是数组在内存中的起始地址,即首元素的地址。

既然字符串常量是作为数组来存储的,那么编译器会将其看成char *类型的指针。由指向首字符的指针和字符串结束标志'\0'就可以唯一的确定一个字符串。

因此,字符串也可以通过以下方式声明:

char * sp = "Hello world!";

需要注意的是,这两种声明方式并不等价,二者有很大差异,可以分为以下几点:

一、数组sa中的元素可以被改变,指针sp所指字符串常量的元素不可以被改变(若想改变指针sp所代表的字符串,只能改变指针的值,让其指向新的字符串)。 假如有如下声明语句:

char sa[] = "This is a string";
char * sp = "This is a string";

要求将sa和sp中的'T'都变成't'; 语句sa[0] = 't';合法; 语句sp[0] = 't';非法内存访问,字符串常量不允许被修改(参考Java中String的不可变) 应该用:char * sp = "this is a string"新创建一个字符串常量。

二、数组名sa是常量,其指向不可改变;而sp是变量,可以指向其它字符串。 例如,现在将sa和sp的内容都改为"Hello";语句:

sa = "Hello";//非法,数组名是常量,不能对其进行赋值,应该用函数strcpy(sa,"Hello")
sp = "Hello";//合法,新创建一个字符串常量,sp指向这个新创建的常量

三、字符指针必须先赋值,后引用。

当用一个字符串常量来初始化一个char*类型的变量时,编译器通常将这个字符串放在内存的常量区,字符串的内容不可修改。 如果需要修改字符串的内容,必须将其存储到字符数组中,这样才能保证在所有的系统上都可以对其进行修改。