一.字符数组 :
1.初始化
1.动态初始化 : arr[n1] = x; arr[n2] = x; .... arr[n] = x; n <= length
1.n = length --- 动态完全初始化
2.n < length --- 动态部分初始化
*未初始化元素,对应内存空间存放垃圾值
2.静态初始化 : char name[length] = {e1, e2, e3, ......... eN}; n <= length
1.n = length --- 静态完全初始化
2.n < length --- 静态部分初始化
*未初始化元素由系统自动默认初始化 --- 使用对应数据类型默认值初始化
*利用编译器这一特点,可以很方便的把所有元素置为空字符
char arr[10] = {0}; --- 第一个元素手动初始化为字符0即空null,因为是静态部分初始化所以剩余元素,系统自动默认初始化 --- 字符默认值是空字符'\0'即空null
*字符0对应的十进制是十进制0,当以十进制格式化输出时,输出值为0
3.自动识别长度的静态完全初始化 : char arr[] = {1, 2, 3, 4);
4.引入字符串概念后,字符数组又多了一种初始化方式
1.为便于用字符数组存储和处理字符串,C允许直接用字符串常量初始化数组
1.指定长度
1.char c[6] = {"hello"};
2.char c[6] = "hello";
2.自动识别长度
1.char c[] = {"hello"};
2.char c[] = "hello";
2.在gcc编译器下测试可知
1.字符型默认值为空字符'\0',对应ASCII码为0
二.字符串
0.字符数组和字符串
1.相同点
1.都是内存中一段连续的char空间
2.字符数组没有结束标识符,字符串有结束标识符
3.当以字符数组表示和存储字符串时,必须把结束标识符'\0'也存入字符数组
*此时的字符数组从内存来看,实际上就是一个字符串
*若不存字符串结束标识符'\0',只是一个字符数组,不是字符串
1.字符串 --- 以双引号定界 且 以空字符'\0'标识结束
2.C语言中有字符串概念,但没有字符串这种数据类型,因而通常需要借助字符数组来存储和处理字符串
1.当把一个字符串存入一个字符数组时,也把标识结束的字符’\0’存入数组,因此该字符数组的长度是字符串实际字符数+1
eg : 字符串 "hello"
char c[6] {1, 2, 3, 4, 5, '\0'};
3.为便于用字符数组存储和处理字符串,C允许直接用字符串常量初始化数组 --- 对于字符数组来说,有多了一种初始化方式
1.指定长度
1.char c[6] = {"hello"};
2.char c[6] = "hello";
2.自动识别长度
1.char c[] = {"hello"};
2.char c[] = "hello";
4.获取字符串长度
字符串 : "hello"
字符数组 : char s[10] = "hello";
1.sizeof运算符 : --- 获取的是被获取对象在内存中的大小,以字节为单位 --- 因为C中字符占1字节,因而获取的大小即为字符数组长度
1.获取字符串大小 sizeof("hello")
2.获取字符数组大小 : sizeof(s);
2.函数strlen(); --- 获取字符串所占内存的有效字节数
1.获取字符串长度
2.获取字符数组长度 --- 前提 : 该数组正确存储了字符串,即存入了结束标识符'\0'
*函数strlen()获取字符串 或 正确存储字符串的数组的长度实际上是对数组或字符数组的遍历 --- '\0'为结束条件
*获取字符数组 char arr[5] = {'a', 'b', '\0', 'c', '\0'};
strlen(arr) = 2
从内存来看,该数组可以表示两个字符串 : "abc\0" 和 "c\0"
5.总结 :
1.C中的字符串本质是以'\0'作为结束标识符的字符数组
char arr[5] = {'a', 'b', 'c', '\0', 'd'};
char arr2[5] = {'a', 'b', 'b'};
printf("%s", arr); //abc
printf("%s", arr2); //abc + 垃圾值 --- 字符串以'\0'作为结束标识符,当找不到时会在对应内存区域继续往后查找,直到遇到'\0',因而会读取到垃圾值