在数组专题的文章讲解中,讲到了二维数组的地址分布情况,之后也陆续有录友与我交流这个问题,这几天抽空去做一下实验,发现在C++中二维数组的地址空间是连续的。
所以单独发文来讲一讲这个问题。
C++测试代码如下:
- // 测存储地址
- void test_arr() {
- int array[2][3] = {
- {0, 1, 2},
- {3, 4, 5}
- };
- cout << &array[0][0] << " " << &array[0][1] << " " << &array[0][2] << endl;
- cout << &array[1][0] << " " << &array[1][1] << " " << &array[1][2] << endl;
- }
- int main() {
- test_arr();
- }
测试地址为
- 0x7ffee4065820 0x7ffee4065824 0x7ffee4065828
- 0x7ffee406582c 0x7ffee4065830 0x7ffee4065834
注意地址为16进制,可以看出二维数组地址是连续一条线的。
一些录友可能看不懂内存地址,我就简单介绍一下, 0x7ffee4065820 与 0x7ffee4065824 差了一个4,就是4个字节,因为这是一个int型的数组,所以两个相信数组元素地址差4个字节。
0x7ffee4065828 与 0x7ffee406582c 也是差了4个字节,在16进制里8 + 4 = c,c就是12。
如图:
可以看出在C++中二维数组在地址空间上是连续的。
像Java,Python是没有指针的,同时也不对程序员暴漏其元素的地址,寻址操作完全交给虚拟机。
所以看不到每个元素的地址情况,这里我以Java为例,也做一个实验。
- public static void test_arr() {
- int[][] arr = {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {9,9,9}};
- System.out.println(arr[0]);
- System.out.println(arr[1]);
- System.out.println(arr[2]);
- System.out.println(arr[3]);
- }
输出的地址为:
- [I@7852e922
- [I@4e25154f
- [I@70dea4e
- [I@5c647e05
这里的数值也是16进制,这不是真正的地址,而是经过处理过后的数值了,我们也可以看出,二维数组的每一行头结点的地址是没有规则的,更谈不上连续。
所以Java的二维数组可能是如下排列的方式:
总结
不同编程语言的数据结构在地址中的分布方式是不一样的,C++中我们是可以直接获取元素的地址,通过实验,我们也证实了二维数组的元素确实是相邻的。
在其他语言中,并没有指针,也获取不到每个元素的地址,以Java为例,通过实验可以推测可能Java里的二维数组是不相邻的。
这里算是对之前讲解数组内容的一个纠正,也是给大家做一个科普。
大家可以发现C++赋给程序员足够的自由,这也是C++的魅力所在。
但有的时候太自由了往往不是好事,编程语言都是各有各的优点,也不是哪门语言难,它就一定好!
好了,希望通过本篇大家可以二维数组的内存分布有个初步的认识了。
本文转载自微信公众号「代码随想录」,可以通过以下二维码关注。转载本文请联系代码随想录公众号。
作者 | 刘晓敏 来源 | 阿里巴巴云原生公众号 Seata 是一款简单易用,高性能、开...
前提条件 请您在购买前确保已完成注册和充值。详细操作请参见 如何注册公有云管...
很多企业普遍认为,迁移到云端会扩大攻击面,因此,在云端存储数据不如在本地存...
一、定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名、括号、...
操作场景 当您的裸金属服务器需要跨POD通信时,可以为裸金属服务器添加一块增强...
本月DataWorks产品月刊为您带来 产品活动 1.参与阿里云DataWorks问卷调研 (Aliyu...
目前 云服务器 有哪些?随着 云计算 的发展, 云服务器 市场上提供 云服务器 的...
本文转载自网络,原文链接:https://mp.weixin.qq.com/s/vqRfJtXcXg6fS_aeX0x8jQ...
本文转载自微信公众号「程序员内点事」,作者程序员内点事。转载本文请联系程序...
2020年是充满动荡的一年,组织面临着众多挑战。进入2021年,大数据行业将会更加...