大家晚上好啊!这篇将进入数组,对数组的概念进行初步理解并学会初步使用
目录
1.数组
数组是具有相同元素类型的集合
2.一维数组的创建
Type arr_name[const]
2.1Type 指数组内部元素的类型
2.2arr_name 指数组的名字
如 arr ,arr1, arr2
2.3const
Const 是常量或常量表达式(但不包括const,const修饰的是常变量)
3.一维数组的初始化
注释中进行了详细解释
补充1:
数组最后一个元素后可以加逗号(并没有什么实际意义),但中间不能连续逗号
补充2:区分字符数组与字符串
字符数组中并没有标准规定结尾默认补充’\0’为结束标志
而字符串中默认’\0’为结束标志,若不超出元素限定长度,则自动在结尾补充’\0’
Sizeof用来计算开辟空间大小,两个数组均开辟了空间存储“abcd”,但不同的是,arr2最后还有一个’\0’,因为char类型,每个元素都是一个字节,因此arr1为4,arr2为5
Strlen用来计算字符串长度,遇到’\0’后停止(但不会将’\0’记为长度),因此strlen(arr2)是4,由于arr1中并没有’\0’,因此输出为随机值。
补充3:区分字符串和字符指针
字符指针指向的字符串串属于常量,在字符串常量区开辟,而不是开辟在main的栈帧里面,常量不可被更改。
而数组初始化的字符串可以通过对数组的下标访问或指针访问进行更改
补充4:
数组只能被整体初始化,而不能整体赋值,赋值要通过下标访问或指针访问进行单独或遍历赋值。
4.一维数组的使用
这里我们将数组的下标访问: [] 是数组下标访问操作符
数组的下标是从0开始,数组的大小可以用sizeof进行计算
5.一维数组在内存中的存储
从上面两个例子可以看出,随着数组下标的增长,元素的地址,也在有规律的递增。由此可以得出结论:数组在内存中是连续存放的
在元素为int的数组中,我们发现数组下标每增加1,地址增加4个字节,而在元素为char类型的数组中,数组下标每增加1,地址增加1个字节。因此地址所对应的数组元素是紧紧相挨的,且地址随下标增加而增长
补充:
我们在之前说过,栈中的栈帧开辟时由上到下的,即由高地址向低地址开辟空间,那为什么数组的地址随着下标的增加而变大呢,不应该越早开辟的元素地址越高吗?
其实数组本身是一个整体,在开辟空间时,数组这个整体会在栈帧中向下开辟一个空间,然后在这个开辟好的空间中,数组内部元素会按照下标排列在其中,使得下标越大,地址越高。
6.二维数组的创建
第一个中括号代表第一个维度,第二个中括号代表第二个维度
这里我们可以理解为行和列
如 arr就是一个3行4列的数组,一共有3*4=12个元素,每行四个元素
7.二维数组的初始化
注释中有详细解释
8.二维数组的使用:
同样是使用下标进行访问
9.二维数组的存储
可以发现二维数组在内存中也是连续存储的
但二维数组不是行列矩形吗,为什么还是连续的呢?
其实我们说二维是行列只是为了形象化的理解,实际上二维数组依然是线性存储的
即第二行排在第一行后依次线型排列。
二维数组本质上仍然可以理解为一维数组,如arr[3][4]是一个有3个元素的一维数组:arr[3]只不过该一维数组内部的元素是一维数组,即arr[3]中的每一个元素都是一个数组,其内部数组有四个int类型的元素是:int arr[4]
10.数组的越界
数组是由有范围的,因此数组的下标也是有范围的,若该数组有n个元素,则下标从0开始,到n-1结束,当通过大于(n-1)的下标访问数组时,就会发生数组越界 ,超出了数组合法空间的访问
当非法访问时,编译器并不一定会报错,但当非法篡改不属于自己的空间时,编译器会报错阻止。因此我们要自己做好越界检查,防止因为越界而导致的结果错误。
这篇先点到这里,下篇是数组的传参和数组名的意义
在这里我还是想发泄一下.....我用WPS把这个稿子整理了将近一个小时然后不小心直接把这个文件关掉了,再进来发现没有保存,我......直接自闭......这里强烈建议大家用随时保存的开发环境或工作环境,要不然......那种一瞬间空空如也的感觉实在是酸爽。
晚安~