char arr[ ] = “abcde” //字符串
char brr[10] = {‘a’,‘b’,‘c’} //字符串
char crr[ ] = {‘a’’b’’c’’d’’e’}; //字符数组
char *drr = “abcde”; //字符串常量
char err[5] = “abcde”; //错误!!!越界!
如果有不明白的,请看以下几条总结:
一、 凡是字符串,必以“\0”结尾
二、 凡是双引号中的内容,皆是字符串。也就是说,双引号会在它所包含内容后面自动加一个“\0”,且占据字节数。
所以 char arr[ ] = “abcde”是字符串;
所以char err[5] = “abcde”是错误的,因为双引号的存在给后面加了“\0”,其长度是6个字节,自然不能放入长度为5字节的err中去
三、 单引号中容纳的是char类型的字符常量,且仅能容纳一个
四、 字符数组中若不指定长度,系统会自动匹配合适的长度。
char crr[ ] = {‘a’’b’’c’’d’’e’};
所以,crr不是字符串,因为它后面没有“\0”
五、 如果对字符数组没有初始化完全,系统会自动在未赋值的地方添加“\0”。
所以,根据第一条总结
char brr[10] = {‘a’,‘b’,‘c’}
是字符串
六、 不能修改字符串常量的值
char *drr = “abcde”;
drr[0] = ‘X’; //这句会导致崩溃
因为定义drr 为指针,其指向的地址为保存在常量区的字符串“abcde”的首元素地址。可以通过该指针读取到该字符串的每个元素,却不能对其修改。
其原理就如同:a = 250 ,250是个数值常量,如果你现在想让
a = 251 ,你只能给a重新赋值,而做不到只把250中的0换成1上去。
七、 定义字符数组必须同时进行赋值。
如:
char str[7] =“abcd”;
不能写成
charstr[7];
str[7]= “abcd”
注意:这个是有例外的。
如果你不是一次性进行全部赋值,则可以先定义一个字符数组,之后再对其中的元素挨个赋值,如:
int main()
{
char str[7];
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = 'd';
str[4] = '\0';
printf("%s\n",str);
}
其打印出来的字符串,也是 abcd
还要注意一点,如果你不自己对末尾赋值’\0’,系统是不会将其用’\0’补充的
如:
int main()
{
char str[7];
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = 'd';
printf("%s\n",str);
}
其打印出来的结果为 :
abcd烫烫烫烫烫烫烫烫烫烫烫烫烫烫XX
这是由于没有初始化完全,导致没有’\0’作为字符串的结束标志,使后面的值无法预测。