数组~

  • ♥. 一维数组
    • 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.一维数组的_使用

  1. 数组是使用下标来访问的,下标是从0开始。
  2. 数组的大小可以通过计算得到

下标引用操作符

{
“下标引用操作符”:
⭐数组通过下标来访问,数组中第一个元素的下标为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]的值。但是编译器不报错,并不意味着程序就正确,所以写代码时,要检查好数组是否越界~~