(一)
字符数组:元素的数据类型为字符类型的数组
如char c[10], ch[3][4]
字符数组的初始化
有两种形式,逐个字符赋值 ‘a’'b' 'c' '\0'
用字符常量赋值 "abc" 这两个是等价的
![](https://i-blog.csdnimg.cn/blog_migrate/8bb4c3d1a2866e92a88a7779667b4bb4.png)
这个不等价于"Hello"了,因为字符常量里面不带\0
![](https://i-blog.csdnimg.cn/blog_migrate/cf8acb77cdc128b200614e2205164e44.png)
0与‘0’与NULL的区别
0: 整数0
'0’: ASCII码值为0
NULL: 宏定义
4.
![](https://i-blog.csdnimg.cn/blog_migrate/037fbdf871ab5a7b6999d942c85de695.png)
第一个是字符数组,虽然没有给维数,但是默认为3
第二个也是字符数组,但是只初始化了3个,后面剩下三个都是\0,s所以这个等价于“abc”
是字符数组的同时也是字符串
这个地方为什么arr1只初始化了 3个字符,但是打印了六个字符呢?
因为arr1和arr2的地址是连续的,arr1中没有\0,但是由于连续,直接跟着打印了arr2中的内容,而arr2中有\0,所以打印了arr1和arr2中内容,就会结束
那么怎么说明arr1和arr2的地址是连续的呢?我们下面在虚拟机里面验证一下,输出一下地址
![](https://i-blog.csdnimg.cn/blog_migrate/6bcaf8b42828c2b0b6c644d228932e90.png)
(二)
![](https://i-blog.csdnimg.cn/blog_migrate/2adad2f6df8c1c980d6ef93b48d06374.png)
“\0”不算字符串长度
2.1比较聪明的初始化方法,列设置为7,保留出\0,可以直接写成字符串
![](https://i-blog.csdnimg.cn/blog_migrate/60decea2dc45a031e83fef82c3c14b16.png)
2.2 这个例子的典型就是行列未知,需要自己计算
![](https://i-blog.csdnimg.cn/blog_migrate/f579250cb05556572c216e690f76bd1f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e6e27075ce0aea24539afc53bbb501d0.png)
这个是计算行,整个二维数组占据的空间/一行占据的空间
![](https://i-blog.csdnimg.cn/blog_migrate/4b7c4eaa6558148a77087a106cb02723.png)
这个是计算列,整个一行占据的空间/每个字符型占据的空间=几个字符
2.3 这个相比于上面的就是少了两个不用的变量,m,j,节省了存储空间
![](https://i-blog.csdnimg.cn/blog_migrate/dadeeee30017ae989793a6e1a308fbbc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/17c4e5007751f83e765d8dac8bd40fb6.png)
2.4(程序输出:设计思路)
2.4.1定义初始化数组全为0(如果不初始化为0的话,输出了有限的字符,剩下的字符就会乱码输出)
2.4.2 定义变量
2.4.3提示输入字符
2.4.4接受键盘输入的字符
2.4.5计算有几个字符 n=strlen(arr); n=sizeof(arr)/sizeof(char)这两种方式都可以
2.4.6逆向遍历数组并依次输出字符
2.4.7返回
![](https://i-blog.csdnimg.cn/blog_migrate/bae0c9431d440a8d4536c046dd586638.png)
2.5 逆序输出字符串的另一种思路
相比于第一种逆序输出(只有一个变量,从最后一个字符开始遍历并且输出)
这边我们可以设置两个变量,一个i,一个j,一个从前面开始遍历,一个从后面开始遍历
12345 \0 1和5换,2和4换,3不换 最终\0也不换 换的时候要借助一个中间变量ch
54321 \0
![](https://i-blog.csdnimg.cn/blog_migrate/f92907e16e78b1618c2facec00586840.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e3655bfb2719ceec1dfbb90860d18988.png)
2.6
gets和scanf的区别是什么?
gets 可以接受空格的输入
scanf不可以接受空格的输入,如果scanf接收了空格,那么这个空格相当于结束符
scanf如果要接收空格后面的字符,那么需要用%c一个个的输入