二维数组的地址分布究竟是什么样的?

开发 后端
在数组专题的文章讲解中,讲到了二维数组的地址分布情况,之后也陆续有录友与我交流这个问题,这几天抽空去做一下实验,发现在C++中二维数组的地址空间是连续的。

[[386826]]

在数组专题的文章讲解中,讲到了二维数组的地址分布情况,之后也陆续有录友与我交流这个问题,这几天抽空去做一下实验,发现在C++中二维数组的地址空间是连续的。

所以单独发文来讲一讲这个问题。

C++测试代码如下:

  1. // 测存储地址 
  2. void test_arr() { 
  3.     int array[2][3] = { 
  4.   {0, 1, 2}, 
  5.   {3, 4, 5} 
  6.     }; 
  7.     cout << &array[0][0] << " " << &array[0][1] << " " << &array[0][2] << endl; 
  8.     cout << &array[1][0] << " " << &array[1][1] << " " << &array[1][2] << endl; 
  9.  
  10. int main() { 
  11.     test_arr(); 

测试地址为

  1. 0x7ffee4065820 0x7ffee4065824 0x7ffee4065828 
  2. 0x7ffee406582c 0x7ffee4065830 0x7ffee4065834 

注意地址为16进制,可以看出二维数组地址是连续一条线的。

一些录友可能看不懂内存地址,我就简单介绍一下, 0x7ffee4065820 与 0x7ffee4065824 差了一个4,就是4个字节,因为这是一个int型的数组,所以两个相信数组元素地址差4个字节。

0x7ffee4065828 与 0x7ffee406582c 也是差了4个字节,在16进制里8 + 4 = c,c就是12。

如图:

可以看出在C++中二维数组在地址空间上是连续的。

像Java,Python是没有指针的,同时也不对程序员暴漏其元素的地址,寻址操作完全交给虚拟机。

所以看不到每个元素的地址情况,这里我以Java为例,也做一个实验。

  1. public static void test_arr() { 
  2.     int[][] arr = {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {9,9,9}}; 
  3.     System.out.println(arr[0]); 
  4.     System.out.println(arr[1]); 
  5.     System.out.println(arr[2]); 
  6.     System.out.println(arr[3]); 

输出的地址为:

  1. [I@7852e922 
  2. [I@4e25154f 
  3. [I@70dea4e 
  4. [I@5c647e05 

这里的数值也是16进制,这不是真正的地址,而是经过处理过后的数值了,我们也可以看出,二维数组的每一行头结点的地址是没有规则的,更谈不上连续。

所以Java的二维数组可能是如下排列的方式:

总结

不同编程语言的数据结构在地址中的分布方式是不一样的,C++中我们是可以直接获取元素的地址,通过实验,我们也证实了二维数组的元素确实是相邻的。

在其他语言中,并没有指针,也获取不到每个元素的地址,以Java为例,通过实验可以推测可能Java里的二维数组是不相邻的。

这里算是对之前讲解数组内容的一个纠正,也是给大家做一个科普。

大家可以发现C++赋给程序员足够的自由,这也是C++的魅力所在。

但有的时候太自由了往往不是好事,编程语言都是各有各的优点,也不是哪门语言难,它就一定好!

好了,希望通过本篇大家可以二维数组的内存分布有个初步的认识了。

本文转载自微信公众号「代码随想录」,可以通过以下二维码关注。转载本文请联系代码随想录公众号。

 

责任编辑:武晓燕 来源: 代码随想录
相关推荐

2011-08-04 13:24:28

IT运维

2011-02-16 16:13:40

Debian

2013-03-28 09:27:58

老罗罗永浩锤子ROM

2015-08-26 09:54:19

物联网

2012-05-28 22:49:50

PureView

2022-06-13 09:51:35

UWB超宽带无线载波通信技术

2019-05-27 15:30:44

Node.jsJavaScript前端

2015-09-29 09:47:14

2018-09-10 13:47:21

数据科学统计学决策

2020-07-08 08:09:08

边缘计算边缘云云平台

2021-08-09 05:19:08

Provider 前端前端代码

2010-03-19 17:30:18

云计算

2012-09-17 09:52:20

云计算云存储公有云

2014-08-07 10:32:02

Windows微软

2009-07-30 14:43:30

认识BSM

2014-07-28 08:28:38

Windows

2022-10-19 12:23:50

缓存CDN外部缓存

2015-06-04 10:26:50

2021-04-21 15:41:21

比特币加密货币技术

2024-04-01 08:24:56

通信协议数据
点赞
收藏

51CTO技术栈公众号