字符数组的初始化
- char c[5] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};把5个字符依次赋值给c[0]~c[4]。
- 如果初值个数小于数组长度,则其余的元素会自动定为空字符’\0’。char c[5] = {‘h’, ‘e’, ‘l’, ‘l’};c[4]会为’\0’。
- 如果初值个数等于数组长度,在定义时可以省略数组长度,系统会根据初值个数确定数组长度。char c[] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};数组c的长度会被系统定位5。
字符串
C语言中是将字符串作为字符数组来处理的(C语言没有字符串类型),区别是字符串末尾有空字符’\0’来作为结束标志,而字符数组不要求这么做。
用字符数组存放一个字符串。
char c[] = {“hello”}; 等价于 char c[] = “hello”; 等价于 char c[] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};
而不与下面的等价:
char c[] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};
注意上面的数组长度为6,而不是5。下面的是5。
用字符指针变量指向一个字符串常量
char *string = "I love China!";
等价于下面两行:
char *string;
string = "I love China!";
这里有一点需要深入,上面的定义表示string是一个char*型指针,指向一个char型字符,那么为什么可以写成string = "I love China!"
的形式呢?
原因在于"I love China!"
是一个字符串常量,被分配在只读数据区,string = "I love China!"
表示将该字符串常量的首地址赋给了string,从而让string指向了"I love China!"
这个字符串。
注意:string是指针变量,其值可以改变->可以再次赋值string = “hello”;
而"I love China!"是字符串常量,其值不能改变,如下面代码段:
char str1[] = "hello";
char *str2 = "hello";
str1[2] = 'r'; //合法
str2[2] = 'r'; //非法,字符串常量不能被改变
str2 = "world"; //合法,str2是变量,可以赋另一个值
联想记忆:数组名是常量,其值不能改变,如下面代码段:
char str[] = "I love China!";
str = str+1; //错误,数组名是常量,其值不能改变
str = "hello"; //错误,数组名是常量,其值不能改变
str[1] = 'r'; //合法,因为改变的不是str,而是*(str+1)