系列文章目录
学习C语言两个月后的收获(篇目四)#超详细的数组讲解
目录
前言
我在初次接触数组的时候就常常搞不清楚数组使用的原理。
本文将会从我当时学习的感受去深入讲解一维、二维数组的创建、使用、在内存中的存储形式
一、数组是什么?
数组,顾名思义就是有一组数。用官方的话来说就是,一组相同元素的集合;
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.二维数组在内存中的存储
由上运行结果可得知:二维数组的存储也是连续存放的
你还记得前面我们说的吗?
我们如果把一维数组当作数组的元素,那么这个数组就是二维数组
再给你回顾一下我在前面放的图,是不是感到豁然开朗呢???!!!
总结
以上就是这篇博文的全部内容了。
主要讲了一维数组、二维数组的创建、初始化、输入输出、在内存中的存储形式
看看是否还能回忆起来呢?(可以拉目录点对点回顾哟!)