C 语言字符串
如果我们定义了一个字符数组:
char word[] = {'H','e','l','l','o','!'};
在上面的数组当中呢我们依次会得到以下内容:
word[0] | H |
word[1] | e |
word[2] | l |
word[3] | l |
word[4] | o |
word[5] | ! |
但是上面的数组不是C语言的字符串,它只是字符数组,因为C语言不能用字符串的方式来做计算。
那么如果我们想定义一个字符串该如何做呢?
只需要在原来的基础上在最后面加上\0
就可以啦。
char word[] = {'H','e','l','l','o','!','\0'};
word[0] | H |
word[1] | e |
word[2] | l |
word[3] | l |
word[4] | o |
word[5] | ! |
word[6] | \0 |
字符串
-
以0(整数0)结尾的一串字符
- 0或"\0’是一样的,但是和’0’不同
-
0标志字符串的结束,但它不是字符串的一部分
- 计算字符串长度的时候不包含这个0
-
字符串以数组的形式存在,以数组或指针的形式访问
- 更多的是以指针的形式
-
string.h 里有很多处理字符串的函数
-
C语言的字符串是以字符数组的形态存在的
-
不能用运算符对字符串做运算
-
通过数组的方式可以遍历字符串
-
字符串变量
我们要去定义一个变量这个变量表示字符串可以使用以下几种形式
char *str ="Hello";//指向Hello的str指针
char word[] ="Hello";//字符数组word里面的内容是Hello
char line[10] ="Hello";//一个长度为10的字符数组line里面的内容是Hello
字符串常量
"Hello"//由双引号括起来的叫做字符串的常量或者字面量
"Hello"
会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
两个相邻的字符串常量会被自动连接起来
char *s ="Hello,world!";
- s是一个指针,初始化为指向一个字符串常量
-
由于这个常量所在的地方,所以实际上s是
constchar* s
,但是由于历史的原因,编译器接受不带const的写法 -
但是试图对s所指的字符串做写入会导致严重的后果
-
- 如果需要修改字符串,应该用数组:
char s[] ="Hello,world!";
指针还是数组?
如果我们要在程序当中写一个字符串的时候我们应该写成数组还是指针呢?可以参考以下几点:
-
数组:这个字符串在这里
- 作为本地变量空间自动被回收
-
指针:这个字符串不知道在哪里
- 处理参数(作为函数参数的时候)
- 动态分配空间
简单的理解就是:
- 如果要构造一个字符串—>数组
- 如果要处理一个字符串—>指针
char*是字符串?
-
字符串可以表达为char*的形式
-
char*不一定是字符串
- 本意是指向字符的指针,可能指向的是字符的数组(就像int*—样)
- 只有它所指的字符数组有结尾的0,才能说它所指的是字符串