Wetts's blog

Stay Hungry, Stay Foolish.

0%

C-类型-字符串-字符串的存储

字符串的分类

单字节字符串

由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
2
3
4
5
6
7
#include <stdio.h>
int main(){
char *str = "Hello World!";
str = "I love C!"; //正确
str[3] = 'P'; //错误
return 0;
}