跳转至

五、数组 Array

数组是数据的集合,当我们需要对一系列数值进行操作时时,将需要用到数组

一维数组

一维数组是按照顺序排列的一列数据组成的数据的集合

一维数组的定义和初始化

数组的定义和初始化:

int arr[10];//定义了一个数组,这个数组类型为int型,意味着这个数组所存储的所有数组都是int类型
            //这个数组的数组名为arr,容量为10

int arr1[] = {1,2,3,4,5,6};//这是数组的另一种定义方式
                          //数组类型是int类型,数组名为arr_1,大小为6
                          //此时已经为数组进行了初始化

int arr2[5] = {1,2,3,4}//使用第一种定义方式时,也可以直接对数组进行初始化,花括号内的1,2,3,4
                       //依次对应arr[0],arr[1],arr[2],arr[3],由于花括号内数据的数量小于数组大小
                       //未对arr[4]进行初始化,则默认为0

注意

  1. 数组存储数据是从下标0开始的 定义数组 int arr[10] 第一个数据是arr[0]最后一个数据是arr[9];
  2. 数组和变量一样,都需要先定义后使用
  3. 数组的大小在定义时一旦被指定,程序运行时就不能被修改
  4. 数组的下标是从0开始到 数组大小减一 的,访问数组时不能越界

访问一维数组元素

访问数组元素的方式是数组名 加 下标的方式

int arr[10];//定义了一个类型为int,数组名为arr,数组大小为10的数组
arr[5] = 10;//访问数组的第6个元素,把第六个元素的位置存入10
printf("%d",arr[5]);//使用printf函数打印arr[5]
int i = 4;
arr[i] = 10;//这也是合法的访问数组元素的形式

注意

  1. 数组下标可以是任意的整型表达式,包括整型常量,整型变量等
  2. 数组元素本身也是变量,有值和地址,地址是计算机在内存种储存变量的地址,下一章指针部分会讲到
  3. 由于数组是一片连续的内存空间,各个元素按照顺序存放,数组名代表数组首个元素的地址,也就是说数组名为arr的数组,arr和&arr[0] 的含义是一样的

下面是几个常用的数组元素的操作

  1. 输入数据

由于数组是一系列数据的集合,向数组种存放数据就需要执行多次,这就要用到循环

int arr[8];
for(int i = 0;i<=7;i++){//前面讲到过,数组的储存是从下标0开始的,最后一个是数组大小减去一,所以这里循环执行的条件是i<=7
    scanf("%d",&arr[i]);//依次存入数据
}

上面的循环从i=0开始到i=7,一共执行了8次,分别为数组的8个元素存入了数组数据

  1. 数组之间数据转换
int arr1[10]={1,2,3,4,5,6,7,8,9,10};//定义并初始化数组arr1
int arr2[10];//定义数组arr2

//我们的任务是将数组arr1内的所有数组复制到arr2中
//数组之间不能之间使用赋值符号 = 进行赋值操作 “arr2 = arr1”这样的表达式是错误的
for(int i = 0;i<=9;i++){
    arr2[i] = arr1[i];//我们可以利用循环来对数组中所有元素单独进行操作,这样就可以实现
}
  1. 数据交换
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义并初始化数组arr

//我们的任务是将数组的第二个数据和第三个数据进行交换
//可以会有人直接写出这样的代码:arr[1]=arr[2];
                           //arr[2]=arr[1];
//仔细分析,这样的代码是没办法完成我们的需求的
//当我们执行第一行代码时,arr[1]的值会直接变成arr[2]的值,再执行第二行代码时,arr[2]的值会变成arr[1]现在的值,也就是之前arr[2]的值
//arr[1]的值就会丢失了
//我们需要引用一个新的变量m来存储arr[1]的值,m=arr[1],然后执行arr[1]=arr[2],arr[1]就会存储arr[2]的值
//然后执行arr[2]等于之前存储arr[1]数值的变量m,arr[2]=m
int m = arr[1];//定义新的变量m来存储arr[1]的值
arr[1] = arr[2];//让arr[1]存储arr[2]的值
arr[2] = m;//让arr[2]的值等于之前存储arr[1]的变量m

上面程序的原理就类似于交换两个不同颜色水瓶里面的水,一个红色一个蓝色 我们需要再准备一个新瓶子,把红色瓶子里面的水倒入里面 然后把蓝色瓶子里面的水倒入第红色瓶子里面,现在蓝色水瓶就空了 然后再把新瓶子里面的水倒入蓝色水瓶里面

  1. 输出数据
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义并初始化数组arr

//思路和输入数据是类似的,使用循环
for(int i = 0;i<=9;i++){
    printf("%d",arr[1]);//我们可以利用循环来对数组中所有元素单独进行操作,这样就可以实现
}

顺序查找

顺序查找部分在数据结构中会详细学,到大二上学期应该会开这门课,据说挂科率老高了,同学们加油 这里只做简单介绍,不做详细讲解

想象这样一个场景,一个数组中存储着一堆学生的期末成绩,需要查找里面考90分的同学 我们的思路是,通过循环依次对数组内的所有元素一一和90进行对比,从而找到为90的元素,并返回它是第几个元素

#include<stdio.h>
int main(){
    int arr[6] = {50,60,77,90,66,80,100};//定义并初始化数组,数组内元素为成绩

    for(int i = 0;i<=5;i++){
        if(90==arr[i]){//让每一个元素都和90进行比较,为真时执行下面花括号内的代码
            printf("分数为90的成绩是第%d个",i+1);//i的值是下标,转换为第几个则需要加1,由于数组是从下标为0开始存储的
            break;//找到了之后,结束循环
        }
    }

}

当然我们给出的数组中是含有目标数组90的,我们就不需要考虑没有找到的情况,但为了增加程序的可用性 我们可以程序的最后添加以下代码来处理查找失败的情况

if(i==7){//当i等于6时,也就是break语句没有执行,退出循环的条件是i不满足小于等于5了
    printf("not exisit!");
}

二维数组

二维数组类似于一个n*m的棋盘,按照顺序存放数据

二维数组的定义、初始化和一些操作下面代码会全部介绍:

int arr[5][4];//定义了一个5行4列的int类型数组,数组名为arr
              //第一个中括号表示二维数组的行数,第二个中括号表示二维数组的列数
//二维数组存储和输出数据也需要用到循环,但是由于它是二维的线性表格,所以我们需要遇到双层循环
for(int i=0;i<5;i++){
    for(int j=0;i<4;i++){
        scanf("%d",&arr[i][j]);
    }
}

//输出也类似于输入
for(int i=0;i<5;i++){
    for(int j=0;i<4;i++){
        printf("%d",arr[i][j]);
    }
}

至此,第五章数组结束