由上面可以看出: 字符串包含字符串常量和末尾加入的空字符\0们
1.这里的0实际上是char形式的空字符\0而非数字字符0,第一个\0是编译器自动添加的,之后的\0是故char数组默认初始化而出的 2.故为了保证让编译器自动添加空字符’\0’,数组开辟空间时大小必须≥ (字符数量+1) 。如果未添加空字符\0,那么这个char数组便仅仅是字符数组而非字符串数组
字符串数组 = 字符数组 + 空字符’\0’字符串 = 字符常量 + 空字符’\0’双括号中的内容称为字符串字面量, 也叫做字符串常量。故上文黄字可写为:
字符串常量可以看作是一个不会改变的变量,它是静态储存的(注意!字符串常量储存在数据段,是静态储存!)
我们把字符串常量作为指向该字符串储存位置的指针(类似把数组名作为指向数组储存位置指针)
// 将字符串常量作为存放了字符串地址的指针进行操作 int main(){ char arr[50] = "asdasdasdasdasdasda"; printf("%c, %s, %p", *"asdasdasdasdasdasda", "asdasdasdasdasdasda", "asdasdasd"); return 0; // 结果为 a, "asdasdasdasdasdasda", 0x100000f61 }字符串数组的构建需要编译器区自动添加一个\0,因此我们需要用特殊的初始化方法来让编译器知道你初始化的是一个字符数组还是字符串数组。
字符串的初始化同数组的初始化,只不过都是通过字符常量来赋值。
int main(){ char arr1[8] = "i am sad"; char arr2[8] = {'i',' ', 'a','m', 's', 'a', 'd','\0'}; char arr3[7] = {'i',' ', 'a','m', 's', 'a', 'd'}; /*当然也可以不提前声明数组的大小,编译器会同数组一样自动分配该字符串的大小*/ char arr4[] = "i am sad"; /*使用指针*/ char *arr5 = "i am sad"; }arr1的初始化等效于arr2的初始化,它们都是字符串数组,而arr3只是一个普通的字符数组
个人有个小问题: 若char数组末尾是默认初始化为\0,而不是编译器自动添加的\0,此时的char数组时字符串数组吗? (实际结构一模一样的话应该就是了吧(雾))
```c int main(){ char arr2[8] = {'i',' ', 'a','m', 's', 'a', 'd','\0'}; char arr2[8] = {'i',' ', 'a','m', 's', 'a', 'd'}; // 问:默认初始化为\0而不是编译器自动添加的\0,此时的char数组时字符串数组吗 }