目录
数组的概念
一维数组的创建和初始化
数组的创建
初始化
一维数组的使用
数组下标
数组元素的打印
数组的输入
一维数组的存储方式
计算数组元素的个数
二维数组的概念
二维数组的创建
二维数组的使用
二维数组的输入和输出
二维数组在内存中的存储
简单来说,数组就是一组相同元素的集合。
数组中存放的是一个或者多个数据,但数组元素个数不能为0且存放的多个数据的类型是相同的。
数组分为一维数组和多维数组,其中多维数组以二维数组最为常见,下面先介绍一维数组:
基本语法:
type name[常量值];
type是指数组中存放数据的类型,可以是:char short int float 等等,也可以是自定义的类型。
name是指数组的名字,简称数组名,这个可以根据实际情况定义,取得有意义就行了。
[]中的常量值指数组的大小,数组元素的个数。
数组的初始化分为完全初始化和不完全初始化
例如完全初始化:
int arr [5]={1,2,3,4,5}; []这里面就存储了1 2 3 4 5这五个元素,至于数组是如何存储数据的呢,后面会一一介绍
不完全初始化:
int arr[6]={1}; 这里只初始化一个元素“1”,剩下的元素默认值都为0
当然还有一个错误的初始化:int arr[3]={1,2,3,4};这里面只给arr开辟了三个存储空间,但是我们存储了四个元素,所以这是不行的。
学会了一堆数组的基本语法,一堆数组可以存储数据,存储数据的目的是对数据的操作,那我们如何使用一堆数组呢?
在C语言中,数组是有下标的,什么是下标,简单来说就是数组的标记(编号),且下边是从零开始的,如下:
在C语言中数组的访问提供了一个操作符[],这个操作符叫下标引用操作符。
使用下标引用操作符可以让我们轻松的访问数组的元素。⽐如我们访问下标为7的元素,我们就
可以使⽤ arr[7] ,想要访问下标是3的元素,就可以使⽤ arr[3] ,如下代码:
接下来,如果想要访问整个数组的内容,那怎么办呢?
只要我们产⽣数组所有元素的下标就可以了,那我们使⽤for循环产⽣0~9的下标,接下来使⽤下标访问就⾏了(遍历数组)。
上面只是按照我们定义的数据大小(元素个数)然后从一到十输出,如果要按照自己的需求数据大小输出呢?
接下来让我们深入了解数组,数组在内存中到底是如何存储数据的呢?
在上面讲到数组是有下标的,也就是编号,好比如学校中的宿舍一样,A栋三楼305宿舍,在C语言中,数组的下标也称地址,也就是C语言后面的重难点——指针
如下图:
(计算机处理的数据都要加载在内存中处理,内存会划分一个个的内存单元——一个字节,然后给每个内存单元编上编号——下标)
我们打印数组的地址看看
从上面的运行结果可以看到,每个地址之间的间隔相差四个字节(因为放的是整型,一个整型是四个字节),也就是说一维数组在内存中是连续存放的,且随着数组下标大小的增长,地址是由小变大的(比如你在二楼204宿舍,你左边是203,右边是肯定是205,数组的存放也是这样)这为后期我们使⽤指针访问数组奠定了基础。
在C语言中,要如何计算数组元素的个数呢,总不能一个一个的去数吧,这时候我们就要用到一个关键字了——sizeof 可以计算类型和变量的大小,也可以计算数组的大小 注意:这是一个关键字!
代码如上,一个整型是四个字节,一共十个整型,所以打印40个字节(单位是字节)
然后我们又知道数组中所有元素的类型是相同的,所以我们可以先算出数组中总字节数量,再算出一个元素占了多少字节,两者相除就是元素个数了,代码如下:
如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组就是三维数组,二维数组以上的数组称为多维数组。
基本语法:type name[常量值1 ] [常量值2 ] ;
例如:
int arr[3][5];
double data[2][8];
上述代码中[3]表示数组有三行 [5]表示数组有五列 int 表示数组的类型,arr表示数组名
初始化:二维数组的初始化也分为完全初始化和不完全初始化
不完全初始化:int arr1[3][5] = {1,2}; int arr2[3][5] = {0};
完全初始化:int arr3[3][5]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
如上,二维数组是按照一行一行来初始化的(也就是说先把第一行的位置存放好了再去第二行存储)
当然我们也可以这样初始化:int arr4[3][5] = {{1,2},{3,4},{5,6}};
特别注意的是:初始化可以省略行,但不能省略列(因为当你定义多少列的时候,内存空间已经定义了每一行可以存储多少个元素了,计算机会自动进入下一行存储)
int arr5[ ][5] = {1,2,3};
int arr6[ ][5] = {1,2,3,4,5,6,7};
int arr7[ ][5] = {{1,2}, {3,4}, {5,6}};
二维数组的访问也是使用下标的形式的,二维数组是有行有列的,只要锁定了行和列就能唯一锁定数组中的一个元素。
例如:int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
第一行蓝色的数字表示列号,左边的绿色数字表示行号,两者都是从零开始的,我们说:第二行,第四列,就能快速的定位出7。
二维数组如何输入和输出呢?思路很简单,可以根据上面二维数组的图,先用for循环把行和列依次产生出来,然后输入数据,存储在每一行每一列中,最后输出。
解释:i 表示行号,j表示列号,第一个for循环三次,依次产生(0,j) (1,j) (2,j) 第一个for循环里面再嵌套一个for循环,循环五次,依次产生(0,0) (0,1) (0,2)…………然后输入数据,第二个for循环输出数据
从输出结果来看,每一行内部的每个元素都是相邻的,地址之间相差四个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是相差四个字节,所以二维数组中的每个元素都是连续存放的,如下图