开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
字符串常量
"Hello"
"Hello"会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0;
两个相邻的字符串常量会被自动连接起来。
C语言的字符串是以字符数组的形态存在的;
不能用运算符对数组做运算;
通过数组的方式可以遍历字符串;
唯一特殊的地方是字符串字面量可以用来初始化字符数组。
字符串常量
例:
#inlcude<stdio.h>
int main()
{
int i=0;//本地变量
char *s="Hello,world";
char *s2="Hello,world";
printf("&i=%p\n",&i);
ptintf("s=%p\n",s);
ptintf("s2=%p\n",s2);
return 0;
}
结果为:
有三个本地变量i,s,s2,i的值直接为0,s指向了某个地方的字符串,那里有字符数组Hello,word\0,s2和s指向了相同的地方,而这个地方的地址很小,属于程序的代码段,而且是只读的。
char *s="Hello,world";编译器会将字符串的内容放在只能读不能写的地方
s是一个指针,初始化为指向一个字符串常量;
由于这个常量所在的地方,所以实际上s是const char *s,但是由于历史的原因,编译器接受不带const的写法,
但是试图对s所指的字符串做写入会导致严重的后果。
如果修改字符串,应该用数组:
char s[]="Hello,world";此时定义的字符串就位于s所处的位置附近。(位于本地变量附近)
指针还是数组?
char *s="Hello"
char word="Hello"
数组:这个字符串就在这里;
作为本地变量空间自动被回收;
指针:这个字符串不知道在哪;
单纯表达一个字符串,这个字符串不会被修改;
作为函数参数,处理参数;(反正无论是数组还是指针,作为参数被传入函数之后都会变为指针)
动态分配空间(字符串空间是通过malloc得到的,只能用指针)。
总结:如果要构造一个字符串->数组
如果要处理一个字符串->指针