数组在内存中的储存

  今天就来探讨下数组在内存中是如何储存的。

  首先我们先创建一个有10个元素的一维数组,假设这个数组的元素是1~10,并将它的每个元素的地址都打印出来,观察一下其中的规律,代码书写如下:

 

   注意这里地址的打印是要用%p,最终程序运行打印出来的结果如下图所示:

   可以看到arr[1]的地址是010FF858,arr[2]的地址是010FF85C,我们知道在16进制中C就是12,看到arr[1]和arr[2]结尾的58和5C,所以就差了4,下面的arr[6]和arr[7]亦是如此,16进制中逢16进1,所以12+4=16,6C进一位就变成70了,所以6C和70相差也是4,再看到下面的arr[8]和arr[9]也都是差4,每相邻的两个元素地址都相差4,我们知道一个整型(int)元素的大小的是4个字节,下面来画图帮助大家理解一下。

   假设一个小红色格子是一个字节的意思,那么一个整型就是4个字节,也就是上图中4个小格子拼在一起,那么如果一个数组中有10个整型元素,那么就像上图中一样表示,现在假设每一个字节给上一个地址,比如上图中前 4个小格子为一个整型,其中每个小格子按顺序编上0~3的编号,每个地址之前差1,那么第一个和第5个地址就分别是0和4,第5个地址是第二个整型元素的第一个格子,所以一个整型元素就差了4个字节。

  再给这每4个格子,也就是一个整型元素,按顺序编上号,分别0~9,我们会发现,其实这里的整型都是紧挨着的,他们在内存中是连续存放的,而且我们也可以发现,arr[1]=010FF858,arr[2]=010FF85C,arr[1]=010FF860以此类推,随着元素下标的增长,地址也是由小地址往大增长,由低到高。

  因此我们可以得到两个结论:

  1.一维数组在内存中是连续存放的

  2.数组随着下标的增长,地址是由低到高变化的

  了解了这个知识点后,其实还有一个用途比较大的作用就是,只要我们知道了数组起始元素的地址,那么我们就可以找到数组内所有的元素,因为数组在内存中是连续存放的,每个整型元素间差4个字节,所以我们每把地址跳过4个字节,就是下一个元素。接下来写代码演示一下:

   我们把第一个下标为0的元素arr[0],它是一个整型,我们取出它的地址,&arr[0],这是一个整型地址,放入一个指针p里面去,那么这就是一个int*p整型指针,这样这个整型指针就指向了第一个整型元素,那么我们这里不打印p,我们来打印p+i,结果如下图所示:

   我们可以发现依然是每个地址间相差4,所以每次循环改变 i 的次数,指针p+1,p+2以此类推下去,地址也是对应地去加4,所以这里程序中的 p+i 就是数组中arr[i]的地址,说明只要p指向的是数组第一个元素,p+i就是数组中arr[i]的地址。

  因此可以的出货一个结论就是,以后我们访问数组,就不用再采用由下标的形式访问数组,就可以用这个知识点来查找,假设现在我们要打印一个数组中的所有元素,不用打印下标的形式,程序编写如下图:

   把p+i解引用,i循环变化,找的就是对应的元素,程序运行,如下图所示:

   这样就成功把数组打印出来了,非常的快捷方便。所以最后大家只要记住,数组在内存中是连续存放的。

   

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

HackerYip

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值