一维数组
一维数组定义一般形式: dataType arrayName[index] dataType 数据类型 arrayName 数组名称 index 下标
看起来很陌生是不是?举一个常见的例子你就眼熟了int arr[ 2 ]。
数组内存是连续的
数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。下图演示了int a[4];
在内存中的存储情形:
「数组内存是连续的」这一点很重要。连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用。
数组的完全初始化:
int arr[4] = {1,2,3,4};
数组中的元素从角标0-4均匀分布,就像下面这个样子
数组的不完全初始化:
表示只给 arr[0]~arr[3] 4个元素赋值,而后面 6 个元素自动初始化为 0,看下图:
数组赋零初始化:
- 对于short、int、long,就是整数 0;
- 对于char,就是字符 '\0';
- 对于float、double,就是小数 0.0。
int nums[10] = {0};
char str[10] = {0};
float scores[10] = {0.0};
这里要注意的是:赋0可以这样初始化,二其他的数字是不可以这样一步赋0的,只能一个一个来赋值。
二维数组
二维数组定义一般形式:
dataType arrayName[ROW][COL];
dataType 数组类型
arrayName 数组名称
ROW 行
COL 列
Ⅰ、定义二维数组就跟我们定义矩阵是一样的,定义一个五行三列的数组int arr[5][3] = {0};
至于赋值的话,有两种方式:
分段赋值:int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
连续赋值:int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
这两种赋值的结果是一样的。
还有二维数组的赋值顺序是从上到下,从左到右,未赋值的部分全部写为0
例如:int a[3][3] = {{1}, {2}, {3}};
1 0 0
2 0 0
3 0 0
或者:int a[3][3] = {{0,1}, {0,0,2}, {3}};
0 1 0
0 0 2
3 0 0
再或者:int a[3][3] = {1,1,1,2};
1 1 1
2 0 0
0 0 0
Ⅱ、如果对全部元素赋值,那么第一维的长度可以不给出。例如:
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
可以写为:
int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
Ⅲ、二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,前提是各个元素的类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。
例如,二维数组a[3][4]
可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。
这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素,比如,一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。
字符数组
字符数组啊,顾名思义就是装字符的数组。。。
char a[10]; //一维字符数组
char b[5][10]; //二维字符数组
char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值
char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度
字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。
char str[30] = {"Mr.Xiwen"};
char str[30] = "Mr.Xiwen"; //这种形式更加简洁,实际开发中常用
这里为了节省内存也可以这样写
char str[ ] = {"Mr.Xiwen"};
char str[ ] = "Mr.Xiwen"; //这种形式更加简洁,实际开发中常用
这里要注意的是:字符数组只有在定义时可以写入字符串,否则的话只能一个字一个字的赋值。
计算机并不如人聪明,人知道这个字符串啥时候结束机器不知道,因此要给字符串的末尾加一个结束标志“\0”。
接下来的划重点!
当字符串逐字赋值时:char str[] = {'a', 'b', 'c'};这里的末尾是不会有结束字符的。
一次性赋值时:char str[7] = "abc123";这里的结尾时有一个结束字符的。
注意看我给str开辟的空间是7,不是6,这是为了给结束字符留一个空位。
看到这里有时候就有人问了:这结束标志有什么用呢,数组就那么长你还能读多了?
欸!你说的对,计算机真的不懂你说的是啥,计算机找不到结束标志就会继续向后找,甚至是跑出内存,最后生成乱码。
这是一个难点,大家自己使用时一定要记得结尾给一个结束标志,别多想,就是直接赋值为0就好
char str[] = {'a', 'b', 'c',0};
char str[] = {'a', 'b', 'c','\0'};
char str[] = "abc"
好了要讲完了,最后一点:
结束字符'\0'不算在字符串长度里,所以用length是检测不到结束字符的