一维字符型数组
C语言中,字符数组可以用来存储字符串 ,而字符串在内存中存储的方式 也是以 字符数组形式存储的 。在使用时,需要注意处理的是字符串还是数组。若处理的是字符串,操作的时候,往往以 结束标志 '\0'为 操作依据,若处理的是数组,操作的时候,往往以 数组长度 作为操作依据 。
字符串 有一个专门的结束标志 '\0',在内存中也要占一个字节。只要是字符串,必须有'\0'。
比如字符串“hello”,它的字符串长度是5个字节,但是它所占的内存空间字节数实际上是6个。
语法:
数据类型 数组名[数组长度];
char s [20]; //一维字符型数组
puts 和 gets
int puts(const char *s);
功能是输出一个字符串
参数:
s //表示字符串 ,可以是字符数组名 ,也可以是字符串常量,比如 "hello"
返回值:
成功 非负数
失败 -1
注意:
puts输出时 自动会加 换行
char *gets(char *s);
功能:
从键盘获得一个字符串
参数:
s //代表就是一块存储空间 --- 需要的是一个一维字符型数组的数组名
返回值:
成功 s
失败 NULL
常用处理字符串的函数
注意在使用以下函数时,都需要加上<string.h>的头文件
1.strlen
size_t strlen(const char *s);
功能是计算字符串长度
参数:
s //表示需要一个指针
可以给的参数形式
a.数组名
b.字符串常量
返回值:
返回字符串长度
2.strcpy
char * strcpy(char *dest, const char *src);
功能是复制字符串:将src中字符串,复制到dest
参数:
src // 表示原字符串
可以给的实参形式:
a.一维字符数组名
b.字符串常量
dest // 表示目的字符串
可以给的实参形式:
一维字符数组名
3.strcat
char *strcat(char *dest, const char *src);
功能是拼接字符串
参数:
dest //目的字符串
可以使用的实参形式
一维字符型数组名
src //源字符串
可以使用的实参形式
a.一维字符型数组名
b.字符串常量
4.strcmp
int strcmp(const char *s1, const char *s2);
功能是比较字符串大小
参数:
s1 //字符串
s2 //字符串
数组名
字符串常量
返回值: //最后 停的位置上字符的差值 来反映大小
s1 > s2 // >0
s1 == s2 // 0
s1 < s2 // <0
可以试着自己编写代码,来实现上述函数所实现的功能
二维数组
语法:
类型说明符 数组名 [常量表达式] [常量表达式]
eg: int a [3][4]
数组初始化:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//全部初始化
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//全部初始化
int a[3][4] = {1,2,3,4,5,6};//部分初始化
int a[3][4] = {{1,2},{5,6},{9,10}};//全部初始化
数组元素的引用: 数组名 [行][列];
二维数组的本质:
前面的文章提过,数组也是一种数据类型。如何判断标识符所代表的数据类型?去掉标识符,剩下的就是标识符对应的数据类型。比如 int a [4],a所代表的类型是int [4],这就是所谓的数组类型。
那么在二维数组中,int [4] a [3] 实质上也是一个一维数组,只不过这个一维数组的元素,是一个一维数组类型,然而,在C语言中不允许这样写,所以写成了int a [3] [4]。
二维数组在内存中实际上是下面这个图上的形式存储的,也就是说:二维数组在内存中按行存储,a[0]、a[1]、a[2]实际上是一个数组名。
因此注意:
1.c语言中,并不存在真正的二维数组,都是用一维数组模拟的。
2.二维数组的本质, 实际上 一维数组类型的一维数组,也就是数组的数组 。
3.二维数组数据存储时,按行优先存储。