字符数组:
char word = ['h','e','l','l','o','w','o','r','l','d','!'];
这是一个字符数组,它的单元是word[0] = h,word[1] = e,word[2] = l……
但是这不是C语言的字符串,因此不能用字符串(接下来会讲)的方式计算。
字符串应该是这样:
char word = ['h','e','l','l','o','w','o','r','l','d','!','\0'];
在最后单元word[11] = ‘\0’;有这个才是C语言的字符串(这个word[11]不计数)
字符串
·以0(整数0)结尾的一串字符
·0或’\0’是一样的,但是和’0’不同
·0表示字符串的结束,但它不是字符串的一部分
·计算字符串长度的时候不包含这个0
·字符串以数组的形式存在,以数组或指针的形式访问
·更多的是以指针的形式
·string.h里有很多处理字符串的函数
·C语言的字符串是以字符数组的形态存在的
·不能用运算符对字符串做运算
·通过数组的方式可以遍历字符串
·唯一特殊的地方是字符串字面量可以用来初始化字符数组
字符串变量
char *str = “Hello”;
char word[] = “Hello”;
char line[10] = “Hello”;
上述均是字符串变量的表达形式
对于第三条,这个字符串在数组中占6个位置(hello+\0)
只要声明字符串变量,系统都会在其后面生成一个\0
10.1-2 字符串变量专题
在上节课说明了,
char *str = “Hello”;
是一个代表字符串的指针,也就是数组,那么我们做如下操作会发生什么事情呢?
#include<stdio.h>
int main(){
char *s = "Hello,World";
s[0] = 'B';
printf("Here!s[0] = %c\n",s[0]);
return 0;
}
乍看之下没什么问题,但是实际上并未运行成功,系统报错:
warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char *s = “Hello,World”;
可见对于s,不能用数组的操作强行给他赋值,那此时再看看它的地址,并且我们再来一个*s2,也看看它的地址如何:
#include<stdio.h>
int main(){
char *s = "Hello,World";
//s[0] = 'B';
char *s2 = "Hello,World";
printf("s = %p\n",s);
printf("s2= %p\n",s2);
printf("Here!s[0] = %c\n",s[0]);
return 0;
}
结果是:
s = 0000000000404000
s2= 0000000000404000
s和s2被赋予了相同的地址。
extra:这时候我们再声明一个int i = 0,查看它的地址,此时i的地址是:
i = 000000000062FE3C
i的地址与s和s2距离非常远,并不是堆栈放置了,以后会再提。
回到之前的问题,对于i,s,s2,它们的地址存放是这样的:
(此处s和s2位置应该调换,翁恺写错了)
s是“Hello,world\0”,这指向了一个较远的地方的地址,叫做代码区
s2由于内容和s相同,所以它们指向了一个相同的地址
对于代码区,这块地方是只读的(只能进行读入操作,不能进行写入),所以当我们想执行s[0] = 'B’的时候,计算机会报错。
综上,对于s,再进行一次总结:
char *s = "Hello,World";
s是一个指针,初始化为指向一个字符串常量
由于这个常量所在的地方(代码区),所以实际上s是const char *s,由于历史原因,编译器接受不带const的写法
试图对s所指的字符串做写入会导致严重的后果
如果要修改字符串,应该用数组:
char s[] = "Hello,World";
看到弹幕上的一句评论,非常有道理:
数组是常量形式的指针,是不能被重新赋值的指针
既然如此,我们再在代码中添加一句数组定义的字符串,并且查看地址,此时是:
i = 62fe3c
s = 404000
s2= 404000
s3= 62fe30
此时s3和i就是在堆栈里面的变量了,其保存形式就和普通数组一样,一个一个存
那么,在使用过程中应该如何判断使用指针还是数组呢?:
数组:这个字符串就在堆栈里
作为本地变量,空间会自动被回收
指针:这个字符串不知道在哪里
常用于处理参数、动态分配空间(如果你的字符串是通过malloc得到的,那么当然是应该要用指针)
构造一个字符串–>数组
处理一个字符串–>指针
char是字符串吗?
·字符串可以表达为char的形式,但是char不一定是字符串
其本意是指向字符的指针,可能指向的是字符的数组(如int),只有它所指的字符数组有结尾的\0,才能说它所指的是字符串
字符串常量
“Hello”
·它会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
·两个相邻的字符串常量会被自动连接起来