字符串的分类
单字节字符串
由char数据类型组成的序列
宽字符串
由wchar_t数据类型组成的序列
内存格式
长为n的字符串在内存中连续存放,每个字符存贮其ASCII码,占一个字节,共n个字节,最后填一个全0字节作为串的结束标志。空串也有一个字节,即只有结束标志字符\0
。
字符串定义方式
字符数组接受字符串
C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中。
1 | char str[] = "hello world"; |
字符指针接受字符串
除了字符数组,C语言还支持另外一种表示字符串的方法,就是直接使用一个字符指针指向字符串。
1 | char *str = "hello world"; |
字符串中的所有字符在内存中是连续排列的,str 指向的是字符串的第 0 个字符;我们通常将第 0 个字符的地址称为字符串的首地址。字符串中每个字符的类型都是 char
,所以 str 的类型也必须是 char *
。
两种方式的区别
它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
内存权限的不同导致的一个明显结果就是,字符数组在定义后可以读取和修改每个字符,而对于第二种形式的字符串,一旦被定义后就只能读取不能修改,任何对它的赋值都是错误的。
我们将第二种形式的字符串称为字符串常量,意思很明显,常量只能读取不能写入。
1 | #include <stdio.h> |