数组~
- ♥. 一维数组
- 1.一维数组的_创建和初始化
- a. 创建
- b.初始化
- 不完全初始化
- 完全初始化
- 全部初始化为0
- 不指定数组大小时
- 2.一维数组的_使用
- 下标引用操作符
- 计算数组元素个数
- 输入输出
- 3.一维数组_在内存中的存储
- ♥.二维数组
- 1.二维数组的_创建和初始化
- a.创建
- b.初始化
- 一般情况
- 全部初始化为0
- 2.二维数组的_使用
- 计算数组元素个数
- 输入输出
- 3.二维数组_在内存中的存储
- ♥.数组越界
♥. 一维数组
1.一维数组的_创建和初始化
a. 创建
数组是一组相同类型元素的集合
数组创建方式
举个栗子:
int num[5];char arr[5*8];
显然,数组num中的元素为int类型,且数组大小为5
数组arr中的元素为char类型,且数组大小为5*8 = 40
b.初始化
1.不完全初始化
2.完全初始化
初始化:在创建数组的同时给数组的内容以初始值
不完全初始化
(关于数组元素的访问,在下面“2.一维数组的_使用”开头会提到,可先看那部分,便于理解)
上面这个例子是不完全初始化,即数组arr前5个元素(arr[0]~arr[4])分别赋1、2、3、4、5,其余未初始化的元素默认为0
完全初始化
欸嘿,这个例子就是完全初始化了
等价于arr[0] = 1,
arr[1] = 2,
arr[2] = 3,
arr[3] = 4.
arr[4] = 5
全部初始化为0
像这样直接写一个 0,就表示给数组arr中的五个元素全部初始化为0
不指定数组大小时
在创建数组的时候,如果想不指定数组的确定的大小就得初始化。
此时,数组的元素个数根据初始化的内容来确定。
如:
此时就根据数组初始化的内容,确定数组大小为5
⭐但是⭐
要注意,
(对于字符数组,‘\0’作为字符结束的标志)
不指定数组大小时,对arr1这样初始化数组时会默认在字符串后加一个\0,此时数组大小就是3;
但是对于arr2,需要人工给他加上’\0’,否则在abc后是随机储存乱码,直到出现’\0’
2.一维数组的_使用
- 数组是使用下标来访问的,下标是从0开始。
- 数组的大小可以通过计算得到
下标引用操作符
{
“下标引用操作符”:
⭐数组通过下标来访问,数组中第一个元素的下标为0,往后依次递增
⭐arr[10]是我们在定义数组时,指定数组大小为10。当要打印数组arr的第3个元素时
printf(“%d”,arr[2]);
其中的arr[2]是指访问数组中的某一个具体元素
⭐[ ]——就是下标引用操作符
}
计算数组元素个数
显然
数组的大小➗每个元素的大小 = 数组元素的个数
输入输出
思路:给数组从arr[ 0 ]开始赋值,很容易想得到用for循环,依次给各个元素赋值,同理,用for循环给他依次打印出来
3.一维数组_在内存中的存储
keyword:连续!
地址是十六进制的数字,(123456789abcdef,a相当于10→f相当于15)
可以看出来,地址是连续的,比如&arr[ 0 ]和&arr[ 1 ], 8+4 = 12(即为c)
因为arr数组中的元素是int类型,占4字节,所以每个元素的地址相差4
♥.二维数组
1.二维数组的_创建和初始化
a.创建
跟一维数组类似,只不过二维数组带两个方括号
像这样
可以把二维数组理解成一个矩阵,第一个方括号内的数代表行,第二个方括号内的数表示列
比如上面arr2:
b.初始化
一般情况
⭐对于二维数组,行可以省,列不能省
对于arr1:自左到右自上而下依次初始化,其余元素为0。arr1[0][0]、arr1[0][1]、arr1[0][2]、arr1[0][3]、arr1[1][0]分别初始化为1、4、6、9、7;其余为0
对于arr2:1,2一组;3,4一组。即,arr2[0][0]、arr2[0][1]、arr[1][0]、arr2[1][1]分别为1、2、3、4
对于arr3:类比一维数组“数组的元素个数根据初始化的内容来确定”,对于二维数组,根据初始化内容确定行数
全部初始化为0
与一维数组一模一样
2.二维数组的_使用
计算数组元素个数
计算方法是两个方括号内的常量(表达式)相乘
同样,类比一维数组,
输入输出
一维数组相当于只有“一行”
而二维数组有“一行一列”,因此可以用for循环嵌套for循环来实现二维数组的输入输出
3.二维数组_在内存中的存储
像一维数组一样,我们尝试打印二维数组arr的每个元素的地址
注意这个地方
第一行的最后一个元素跟第二行第一个元素的地址相差也为4!
这说明,二位数组中元素的地址也是连续的,相当于:
可以得出结论:二维数组在内存中的存储也是连续的
♥.数组越界
数组的下标是有范围限制的。数组的下标规定从0开始,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
比如:
这个数组arr只有5个元素,最后一个元素的下标为4
因此arr[5]就是非法的了,越界了。
对于二维数组,它的行和列也可能存在越界
⭐⭐⭐要注意,C语言本身不做数组下标的越界检查,像这个例子一样,编译器没报错,也能打印arr[5]的值。但是编译器不报错,并不意味着程序就正确,所以写代码时,要检查好数组是否越界~~