首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一维数组和数组在内存中的存储原理

一维数组和数组在内存中的存储原理

作者头像
云泽808
发布于 2025-12-30 16:58:18
发布于 2025-12-30 16:58:18
3130
举报

一、数组的概念

数组是一组相同类型元素的集合

  1. 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
  2. 数组中存放的多个数据(比如说你要在一个数组里存放1~100),类型是相同的。

数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

二、一维数组的创建和初始化

2.1数组创建

一组数组创建的基本语法如下:

代码语言:javascript
复制
1 type arr_name[常量值];
 数组的元素  数组  数组的元素个数
 类型       名字

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。

  1. type指定的是数组中存放数据的类型,可以是:char、short、int、float等,也可以自定义的类型。
  2. arr_name指的是数组名的名字,这个名字根据实际情况,起的有意义就可以。
  3. [ ]中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。

比如:如果想存储一个班级人的数学成绩,就可以这样创建一个数组:

代码语言:javascript
复制
int math[20];//整型数组

也可以根据其他需要,创建其他类型和大小的数组:

代码语言:javascript
复制
char ch[10];//字符数组
double data[21];//浮点型类型数组

2.2数组的初始化

有时候,在数组创建的时候,我们需要给定一些初始值,这种就称为初始化。 数组的初始化一般将数据放到大括号里面,为了便捷,我们这里将初始化内容和监视窗格的内容直接放到一起看:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

字符数组既可以用字符串初始化,也可以用单个字符来初始化(注意只有字符数组可以这样做)虽然ch1和ch2初始化的形式不太一样,但是实际效果是一样的:

在这里插入图片描述
在这里插入图片描述

而且数组只要初始化了就可以省略掉数字的大小,数组的大小会根据初始化的内容来推断,如arr5:

在这里插入图片描述
在这里插入图片描述

注意这是一种错误的初始化方法:

代码语言:javascript
复制
int arr3[5] = { 1,2,3,4,5,6};//错误的示范,初始化的项太多,系统会报错

2.3 数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型:

代码语言:javascript
复制
1 int arr1[10];
2 int arr2[12];
3
4 char ch[5];

arr1数组的类型是int [10] arr2数组的类型是int [12] ch数组的类型是char [5] 注意,单独的int,char说的是数组里一个元素的类型,数组元素是有类型的,但数组的本身也是有类型的。 这里用一串代码解释一下为什么要提这个概念,之前为了打印数据所占的长度,既可以用它的变量名,也可以用它的类型:

在这里插入图片描述
在这里插入图片描述

我们也可以用sizeof算数组所占内存空间的长度:

在这里插入图片描述
在这里插入图片描述

出现这样的计算结果的原理是,一个数组有10个元素,每个元素都是int类型,四个字节,10个元素就是40个字节,可以看出这里用数组的类型打印和数组名打印的结果是相同的,所以[ ]里的值也是类型的一部分,这也是解释这个概念的原因。

三、一维数组的使用

数组存放数据的目的就是对数据进行操作,那我们如何使用一维数组呢?

3.1 数组下标

C语言规定数组是有下标的,下标的作用,类似于在一个公寓里找房间,通过房间号找房间,在数组里用下标找元素,比如说6的下标就是5,也可以叫索引,本质上没有区别,只是叫法不同。下标从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:

代码语言:javascript
复制
1 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
在这里插入图片描述
在这里插入图片描述

在C语言中数组的访问提供了一个操作符[ ],这个操作符叫:下标引用操作符。 有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为5的元素,我们就可以使用arr[5],这里展示一下输出效果:

在这里插入图片描述
在这里插入图片描述

这里也可以把[ ]里的值进行更改:

在这里插入图片描述
在这里插入图片描述

3.2 数组元素的打印

如果我们想要访问整个数组的内容,要怎么操作呢? 根据前面的内容,只要我们产生所有元素的下标就可以了,我们可以使用for循环产生0~9的下标,然后使用下标访问就可以了。 如下:

在这里插入图片描述
在这里插入图片描述

当然倒着整也可以,只要思想不滑坡,办法总比空难多

在这里插入图片描述
在这里插入图片描述

这里我们也可以打开监视窗格,里面有具体的下标和元素的一一对应,这里我就不展示了。

3.2 数组的输入

明白了数组的访问,我们也可以根据自己的需求,给数组输入自己想要的数据,如下:

在这里插入图片描述
在这里插入图片描述

有的兄弟就要说了,之前不是在关机程序里说过吗,数组名本来不就是地址吗?为什么这里还要取地址

在这里插入图片描述
在这里插入图片描述

注意这里是一个数组元素,不是地址,这些数据都是挨个读入放入数组之中,也同样的原理,挨个输出出去,依旧可以打开监视窗格验证,数组中每一个元素都有它的地址,所以才能取地址。

四、一维数组在内存中的存储

有了前面的理解,我们在使用数组的时候就没有什么障碍了,但是如果要深入了解数组,我们还要了解一下数组在内存中的存储,接下来展示如何依次打印数组元素的地址:

代码语言:javascript
复制
printf("&arr[%d] = %p\n", i, &arr[i]);

这串代码的意思就是把下标i的元素的地址打印出来:

在这里插入图片描述
在这里插入图片描述

这里是不是地址前面好多0,显得很长不好看呢?其实只要微微调整一下就可以了,这里再扩展一下。 这里我们用的是64位平台即x64,64位平台地址都比较长一些,系统默认的都是配置成64位环境,编译出来的是64位程序,只能在64位环境中运行。这里我们改用32位平台,配置成32位环境,编译出来的是32位程序,32位程序在32位环境、64位环境中都能运行,即x86就可以很好的解决这个问题了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从输出的结果我们分析,数组随着下标的增长,地址是从小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。 这里有兄弟要问了,怎么看出来差四个字节的,不是还有C吗,这个是怎么看的。 按照常规的理解:

  1. 2进制数字:0-1
  2. 8进制数字:0-7
  3. 10进制数字:0-9
  4. 16进制数字:0-15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

但是如过16进制的每一位数字是这样的话,那我问你,如果给你一个数字,比如说112 你说这是一个什么数字,这是一个112吗?还是第一位是1,第二位是12呢?还是1 1 2呢?所以当我们写出112的时候,是区别不出来是第一种表示还是第二种表示的,所以这时候16进制的数字就是这样一一对应的,无论大小写都无所谓。

代码语言:javascript
复制
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
                    a  b  c  d  e  f
                    A  B  C  D  E  F
在这里插入图片描述
在这里插入图片描述

补充:这里0C变成10是12加4,16进制是逢16进1,所以变成10了。

在这里插入图片描述
在这里插入图片描述

所以我们得出结论:数组在内存中是连续存放的。这里还牵扯着后期指针的问题,后面会出文章来写。

五、sizeof计算数组元素个数

这个标题是什么意思呢? 这里我们举一个例子,比如说我们要打印这样一个数组的内容

在这里插入图片描述
在这里插入图片描述

这个数组不一定有8个元素,也有可能有18个元素,但是上面如果变的话,下面i<8就要改为i<18,这个就不方便了是不是,那么有没有什么方法无论上面数组元素个数怎么改变,下面的代码不变呢?这里就让i<8与数组元素个数关联起来就可以了。这里就涉及了一个问题,如何计算一个数组的元素个数?

方法是有的,可以使用sizeof,也是老朋友了。 sizeof是C语言中的一个关键字,可以计算类型或者变量的大小的,其实sizeof也可以计算数组的大小。比如:

在这里插入图片描述
在这里插入图片描述

这里整型一个元素是4个字节,有10个元素,所以是40个字节,计算的是数组所占内存空间的总大小。 我们又知道数组中所有元素的类型都是相同的,那只要计算出一个元素所占字节的个数,数组的元素个数就能计算出来。这里我们选择第一个元素算大小就可以,因为一个数组的类型如果是整型,它的所有元素的大小都是相同的,再加以代码解释:

代码语言:javascript
复制
sizeof(arr) //计算的是数组的总长度
代码语言:javascript
复制
sizeof(arr[0]);//计算一个元素的长度(第一个元素)
代码语言:javascript
复制
printf("%zd\n", sizeof(arr) / sizeof(arr[0]));//计算元素个数

总长度除以一个元素的长度嘛。

在这里插入图片描述
在这里插入图片描述

这样就可以计算出数组的元素个数了。我们再用sz替换掉for循环中判断的部分,无论定义的int arr[ ]括号内是什么值,都不用再更改for循环中的判断条件了,是不是很方便呢?这里我们方括号内的内容改为5。

今天的数组内容就写到这里了,也是又花了一个晚上的时间,希望各位能喜欢小编的内容,多多三连支持一下,小编目前的计划是在大一下学期结束之前搓出一个扫雷游戏,尽量争取吧哈哈,期末了课程还是挺紧张的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、数组的概念
  • 二、一维数组的创建和初始化
    • 2.1数组创建
    • 2.2数组的初始化
    • 2.3 数组的类型
  • 三、一维数组的使用
    • 3.1 数组下标
    • 3.2 数组元素的打印
    • 3.2 数组的输入
  • 四、一维数组在内存中的存储
  • 五、sizeof计算数组元素个数
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档