Bootstrap

学习C语言两个月后的收获(篇目四)#超详细的数组讲解

系列文章目录

学习C语言两个月后的收获(篇目四)#超详细的数组讲解


目录

系列文章目录

文章目录

前言

一、数组是什么?

二、一维数组

1.一维数组的创建

2.一维数组的初始化

3.数组的类型(一维数组+多维数组)

4.一维数组的使用 

a. 数组的下标

b.  数组元素的打印

c. 数组的输入

5.一维数组在内存中的存储

.二维数组

1.二维数组的概念

2.二维数组的创建

3.二维数组的初始化

4.二维数组的使用

a.二维数组的下标

b.二维数组的输入输出

5.二维数组在内存中的存储​编辑

总结



前言

我在初次接触数组的时候就常常搞不清楚数组使用的原理。

本文将会从我当时学习的感受去深入讲解一维、二维数组的创建、使用、在内存中的存储形式


一、数组是什么?

数组,顾名思义就是有一组数。用官方的话来说就是,一组相同元素的集合

TIPS:

1. 数组里面存放的是一个或者多个元素,也就是说 { } 中不能一个元素也不放

2.同一个数组中存放的数据类型要相同。

3.数组分为一维数组和多维数组,其中常见的多维数组为二维数组

二、一维数组

1.一维数组的创建

语法形式: 类型  数组名[ 数组元素个数 ] ; --->  type arr_name[  ];

int arr[7]; int--该数组中存放元素的类型为 int ; arr-- 数组名 ; [] -- 下标操作符 ; 7 -- 数组中存放7个元素

TIPS:

1. 数据的类型有多种,eg. char    short    int     long    long    float   double  

2.数组名可以自定义,但是不要与关键字、C语言语法规定的名称相撞就行。最好要有意义

3.[ ] --> 下标引用操作符,里面只能放常量。用来指定数组的大小

再举几个数组创建的例子(如下代码):

char name[10];

float money[11];

double score[12];

2.一维数组的初始化

前言:创建与初始化的区别在哪里? 创建是指这个东西从无到有的过程;初始化是指在创建的时候在给它一个初始值。

注意:数组的初始化用的是大括号,将数据放在大括号之中。

char name[10] = {"zhangsan"};

int age[5] = {10,20,25};

初始化也分为完全初始化与不完全初始化。

完全初始化:初始化时,给数组的初始值个数等于这个数组应该放置元素的个数

不完全初始化:初始化时,给数组的初始值个数小于这个数组应该放置元素的个数。这个时候,系统就会将数组中剩下的位置初始化为0(也可以说是'\0',因为0和'\0' 的ASCII码值相同)

3.数组的类型(一维数组+多维数组)

前言:int age = 10;  变量 age 的类型是int ; char ch = 's' ; 变量ch 的类型是 char

那么char name[10] = {"zhangsan"}; 中 数组名name 的类型是什么?你可能会想是不是char ,如果是char 的话,那么数组name 与 char name; 又有什么区别呢?所以数组name 的类型不是char ,而是 char [10]  

从以上的例子中我们难免会发现一个规律:-->  数组的类型就是去掉数组名剩下的部分。

4.一维数组的使用 

a. 数组的下标

C语规定,数组的下标是从0开始的;

那我们是怎么访问数组中的元素的呢? 利用下标引用操作符---> [ ]

b.  数组元素的打印

要是想打印以上 arr 的所有元素,用printf() 一个一个地写出来也不是不可以,那要是这个数组有100个元素,岂不是要把这一百个元素的下标都写一遍出来?显然还有其他办法来打印数组

----> 用 for 循环产生所有元素地下标 0-6,再让printf() 打印即可

#include<stdio.h>

int main( )
{
   int arr[7] = {1,2,3,4,5,6};  //对数组初始化

   int i = 0; 

   for(i = 0; i < 7; i++ )  //i从0开始,当小于7时,这个循环才会继续
  {                         //而每当循环一次,i就自增1
                            // i会依次产生下标 0-6 ,每循环一次--> 打印一次
     printf("%d ",arr[i]);  //输出为 1 2 3 4 5 6
                            
                           }
    return 0;

 }

c. 数组的输入

同数组的打印类似,不过就是将printf() 换成了 scanf()  ,换汤不换药。

#include<stdio.h>

int main( )
{
   int arr[7] = {1,2,3,4,5,6};  //对数组初始化

   int i = 0; 

   for(i = 0; i < 7; i++ ) 
  {                        
                            
     scanf("%d ",arr[i]);  
                            
                           }
    return 0;

 }

5.一维数组在内存中的存储

我们将案例中数组arr 所有元素的地址打印出来看看

从上面的地址我们可以发现:当数组元素的下标增大时,该数组对应的地址也跟着增大,相差4(单位 byte )是因为我们举例子的这个数组元素的类型是int ,int 类型的变量在空间中占4字节.---> 数组中的元素在内存中连续存放

三.二维数组

1.二维数组的概念

前言:平时我们在理解一维二维三维的时候怎么理解的呢?一维只有长或者宽,二维既有长又有宽,而三维是有长宽高。基于此,我们大概对二维数组可能有一点概念了,二维数组就是有横有列表现形式的数组,但是它在内存中存储的形式和一维数组一样。

而我们如果把一维数组当作数组的元素,那么这个数组就是二维数组(请务必记住这句话,这句话是理解的重点);当然,如果我们把二维数组当作数组的元素,此时的数组就为三维数组;二维以上的数组统称为多维数组

2.二维数组的创建

语法: 类型  数组名 [常量,表示行数 ][常量,表示列数] ;

     -->   type  arr_name[ 常量值1 ][ 常量值2 ] ; 

int arr[2][3]; 

上述代码中,2 表示行数,有多少行 ; 3 表示列数,即一行有多少个元素 ;int 表示这个二维数组中的每一个元素的类型都是整型 ; 数组arr 的类型为 int [2][3]

3.二维数组的初始化

初始化:在这个数组创建的时候,给它一些初始值。

二维数组的初始化也分为完全初始化与不完全初始化。

完全初始化:初始化时,给数组的初始值个数等于这个数组应该放置元素的个数

不完全初始化:初始化时,给数组的初始值个数小于这个数组应该放置元素的个数。这个时候,系统就会将数组中剩下的位置初始化为0(也可以说是'\0',因为0和'\0' 的ASCII码值相同)

核心是:不完全初始化系统补的是数组中的空位

二维数组有点特别,因为再给它初始化的时候,可以用 { } 来限定一行的元素,请看下面的代码

int arr1[3][3] = {1,2,3,4,5,6,7}};

int arr2[3][3] = {{1,2},{3,4},{5,6,7}};

int zrr3[3][3] = {{1,2,3},{4},{5,6,7}};

二维数组里面可以再套 { } ,来定制我想让元素呆在第几行---> 显而易见,因为定制的不同--> 即使元素个数相同,元素的值相同,但是它们初始化的位置不完全相同。特别注意,里面的 { },在定制每一行有那些元素时,个数是受限制的,如果 里面的{ }中的元素个数超出了范围--> 会报错

初始化的时候可以省略行数,但是不要可以省略列数。这是为什么呢?本作者是这样理解的,我把二维数组看成方队,方队的排列的整齐与否与一行有多少个人有关,换句话说就是,这个把一行有多少个人确定了,多的人再一行一行地叠,这个方队就会很好地组建。一行有多少个人就是列--->也就是说列很重要

int arr[][3] = {1,2,3,4,5,6,7};  //一行规定得有三个元素,多的就往后面叠

4.二维数组的使用

a.二维数组的下标

想要访问二维数组中的元素也是用下标来进行访问的,二维数组有行和列,只要锁定了行和列就可以锁定一个元素。C语言规定,二维数组的行与列都是从0开始的。

b.二维数组的输入输出

核心--> 利用循环产生数组的所有坐标就好了

#include<stdio.h>

int main( )
{
  int arr[3][2] = {1,2,3,4};
  int i = 0;
  int j = 0;
  for( i = 0; i <3 ; i++)  //控制行数
     { 
        for(j = 0; j < 2 ; j++ )  //控制每一行元素
          {
             scanf("%d",arr[i][j]);
           }
      }

  for( i = 0; i <3 ; i++) //控制每一行
      { 
         for(j = 0; j < 2 ; j++ ) //控制每一行元素
            {

             printf("%d ",arr[i][j]);
   }
       }
 return 0;
}

5.二维数组在内存中的存储

由上运行结果可得知:二维数组的存储也是连续存放的

你还记得前面我们说的吗?

我们如果把一维数组当作数组的元素,那么这个数组就是二维数组

再给你回顾一下我在前面放的图,是不是感到豁然开朗呢???!!!


总结

以上就是这篇博文的全部内容了。

主要讲了一维数组、二维数组的创建、初始化、输入输出、在内存中的存储形式

看看是否还能回忆起来呢?(可以拉目录点对点回顾哟!)

;