一维数组 二维数组的理解 sizeof 变长数组

引言:在生活中 同种类型的东西有很多 在C语言中 也有很多数据类型 整形 浮点型 字符型等等 那我们如何能够一次存储多个相同类型的数据呢? 让我们一起学习今天的知识--数组

1.数组的概念

数组是一组存放相同类型元素的集合 它可以存放一个或多个相同类型的数据 数组分为一维数组和多维数组 我们最常用的就是一维数组和二维数组

2.一维数组的创建和初始化

  2.1数组创建

a1e4950fcddf4c38945243d0b4b61363.png

上图为一维数组创建的基本语法 type意思是类型 代表我们要存放元素的类型 arr_name 是由我们定义的数组的名字 常量值代表数组中元素的个数 

97237379fbd142ffb1ad0a35e91a4c97.png

上图为创建一个数组的例子 这就是一个名为math的数组 数组元素个数为20 每个元素类型为整形 名字math的理解就比如我们创建一个整形变量a 那我们就要写int a 那a就是这个整形变量的名字 数组类比一下就好理解了 

  2.2数组的初始化

我们定义一个变量时 给它赋一个初始值 就代表初始化 数组也是一样 给数组内的元素赋值就是给数组初始化 数组的初始化一般用大括号

e085133b00684cc6a0a9a4e206d70281.png

第一个完全初始化 大括号里的值从左到右代表第一到第五个元素的值 还有不完全初始化 那么剩下没有赋值的元素会默认为0 数组有几个元素大括号里就给几个值 用逗号分开  

  2.3数组的类型

数组也是有类型的 当我们创建一个整形变量时 比如 int a 去掉名字剩下的就是变量的类型 去掉a剩下int 就是a的类型 所以a是一个整形变量 数组也是一样

f90cf4139e3a40c6adfb85f51a7d233a.png

去掉名字 剩下的就是数组的类型 所以

arr1的类型为 int [10] 

arr2的类型为 int [12]

ch的类型为char [5]

3.一维数组的使用

  3.1数组下标

C语言规定数组是有下标的 下标从0开始 所以第一个元素的数组下标为0 第二个元素的数组下标为1 以此类推

e61c9b785a994d7690dfb848a94fde99.png

“[]” 这个符号在C语言中叫做下标引用操作符 这个操作符能用来访问数组中的元素 如果我们想要访问下标为7的元素 那么就可以使用arr[7]

4109c412302d425daacfb44ebc3da808.png

如上图 arr[7] 就代表数组中的第八个元素8 那么程序就会打印8 arr[3]就代表数组中的第4个元素 程序就会打印4 这就是下标引用操作符的用法 我们也可以用来对数组元素进行赋值 加减等操作

  3.2数组的打印

如果我们想要访问整个数组的元素 那我们就要使用循环来产生所有的下标 这样就可以一个一个访问数组中的所有元素了

884edc49869241de857f7cdf84109add.png

如上图 我们定义了一个整形数组 再使用for循环来打印数组中的每个元素 以i作为下标 通过for循环循环10次 这样就能打印数组中的每个元素 

  3.3数组的输入

当我们想要让使用程序的用户决定数组的内容时 我们就可以用下面的代码来实现让用户输入数组的内容

d31c7afd1b5641f6b5fe015511fec082.png

代码如上图 跟数组的打印大差不差 

4.sizeof计算数组元素个数

在C语言中 有一个关键字叫sizeof 用来计算类型或者变量的大小 单位是字节 

8a7568cf97944b71be1510b1cd8e3369.png

用法如上图 sizeof() sizeof计算的就是放在括号里的数据的大小 里面放数组名 就能计算整个数组的大小 这里输出的结果是40 因为arr是一个整形数组 里面有10个元素 一个整形在内存中占4个字节 10个整形元素在内存中就占40个字节 所以这个数组的大小为40个字节 

那么我们知道 数组中的元素都是相同类型的 所以我们用sizeof计算出整个数组的大小 再计算出一个元素的大小 二者相除就能知道总共有多少元素了

23d517f010f94831b9686cdaf4563249.png

如上图 arr[0] 就代表第一个元素 我们用一个整形变量sz来接受计算结果也就是数组的元素个数 所以这个打印的结果就是10

所以当我们以后不确定数组的元素个数时 就可以用这种方法来求得数组元素的个数

5.二维数组

我们可以把一个一维数组看做一个元素 那么这个元素便也可以被数组存放 把一维数组作为元素存放 那么这个存放一维数组的数组就是二维数组

b786612c15434793973f4f605c556c1e.png

 我们在之前说过 去掉名字剩下的就是类型 就如同创建一个变量一样 我们用一维数组存放相同类型的变量 也可以用二维数组来存放相同类型的一维数组 如上图 一维数组的类型为 int [5] 所以我们可以创建一个二维数组来存放相同类型的一维数组

  5.1二维数组的创建

668ae540907e4caab712a700d451d144.png

如上图 3表示数组有三行 5代表数组有5列 也就是每一行有5个元素 int 代表每个元素的类型为整形 arr就是二维数组的名字 

下面我们从另一个角度来理解二维数组

二维数组是把一维数组作为元素存放 那么其实二维数组也是一个特别的一维数组 那么我们就把它当一维数组看待 那么arr就可以写成

int [5]   arr[3] 这个一维数组中元素的类型是int [5] 就是存放5个整形变量的一维数组 并且arr中存放了三个这样的数组作为元素 这就是二维数组

上面我们把数组具象为三行五列 结合上述理解 每一行就是二维数组的一个元素 这个元素是一个一维数组存放5个元素 所以有5列 三个这样的一维数组便构成了一个二维数组 

  5.2二维数组的初始化

    5.2.1不完全初始化

6ee27f79f05140d3be1d17f26fcd9afa.png

7d4555f604324b7f9222c462f84ad0aa.png 

不完全初始化如上图 二维数组的初始化顺序是由上至下 由左至右的

    5.2.2完全初始化

 4968e807f47f4cffb075d5ad160515d7.png

完全初始化如上图 

    5.2.3按照行初始化

069973d437014ecf85168aa91ec9a788.png

按照之前的解释 二维数组就是存放一维数组的数组 每一行就是二维数组的一个元素 也就是一个一维数组 所以我们按照行初始化时相当于对每行的一个一维数组初始化 所以在大括号里再使用大括号 剩下的没初始化的元素便按照规则默认为0

    5.2.4 初始化时省略行 但是不能省略列

 f4b5d62454ec43df9477a3fd9f0009a0.png

在给一维数组初始化时可以不在[]中填入一个常量 比如int arr[]={1,2,3} 这样一来 我们初始化几个值 编译器就会默认数组中有几个元素

为什么二维数组初始化可以省略行但不能省略列呢?

如果我们省略列的话那编译器就不知道一行有几个元素 那么编译器就永远无法对第二行进行初始化了

从另一个角度讲

按照我们对之前的理解 二维数组也可以说是一个特殊的一维数组 以arr5为例 我们可以把arr5改写为

int[5] arr[] 代表arr中元素的类型是一个存放5个整形元素的一维数组 那么如果我们省略列的话 那我们便不知道要存放元素的类型 那边无法初始化arr5这个“一维数组”了。

  5.3二维数组的使用

    5.3.1二维数组的下标

5de7cc31eaf14112b1103467abfdac35.png

 66f5f29110874bb8a64f3b0a27d103df.png

 cab49d72940743628a41875575a22018.png

二维数组下标的使用案例如上图

我们之前说过 二维数组的每一行是一个元素 即一个一维数组 那么arr[0] 就是第一行 arr[0]就相当于第一个元素也就是第一个数组的数组名  所以arr[0][1]就相当于第一个数组的第二个元素 从这个角度看就跟使用一维数组没有区别了

    5.3.2二维数组的输入和输出

1fa52dbc8aa6462aac1a2fb7c886e316.png

上图为二维数组的输入 我们使用for循环嵌套来解决二维数组的问题 i代表行 最外层的for循环代表打印每一行 里面嵌套的for循环代表打印一行的每一个元素 我们用j来代表列 这样就能遍历二维数组的每一个元素

 b6b53bdacd1b437aa75d64fbc7c17853.png

二维数组的输入也用一样的方法

 6.c99中的变长数组

c99是C语言使用的标准规则 在c99标准之前 数组的大小只能用常量或者常量表达式来指定也就是[]里的值必须是常量

1d7de3c1be4f4bc7a338aa7493a157aa.png

有这样的限制存在使数组的使用不够灵活 一旦数组创建 那么数组的大小就定死了

在c99规则出版之后 就有了变长数组的概念 数组的大小不再确定 可以交给用户决定

 da4e7424d04f425f936f3a406dba199e.png

如上图 arr中数组的元素个数是一个变量n 编译器无法事先确定 用户可以随意修改arr的大小 这样一来 数组的大小只有在运行的时候才能确定 所以变长数组不能初始化

注:在vs中 变长数组是不支持的 但是并不代表变长数组不能使用

完 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值