This commit is contained in:
youngyangyang04
2021-04-21 08:52:43 +08:00
parent 85094cbeeb
commit 0d30cba30e
3 changed files with 266 additions and 11 deletions

View File

@@ -1,6 +1,3 @@
<p align='center'>
<img src="https://img-blog.csdnimg.cn/20201215214102642.png" width=400 >
</p>
<p align="center">
<a href="https://github.com/youngyangyang04/leetcode-master"><img src="https://img.shields.io/badge/Github-leetcode--master-lightgrey" alt=""></a>
<a href="https://img-blog.csdnimg.cn/20201115103410182.png"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
@@ -48,16 +45,83 @@
**那么二维数组在内存的空间地址是连续的么?**
我们来举一个例子,例如: `int[][] rating = new int[3][4];` 这个二维数据在内存空间可不是一个 `3*4` 的连续地址空间
不同编程语言的内存管理是不一样的以C++为例在C++中二维数组是连续分布的。
看了下图,就应该明白了
我们来做一个实验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 = cc就是12。
如图:
![数组内存](https://img-blog.csdnimg.cn/20210310150641186.png)
**所以可以看出在C++中二维数组在地址空间上是连续的**。
像Java是没有指针的同时也不对程序员暴漏其元素的地址寻址操作完全交给虚拟机。
所以看不到每个元素的地址情况这里我以Java为例也做一个实验。
```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的二维数组可能是如下排列的方式
![算法通关数组3](https://img-blog.csdnimg.cn/20201214111631844.png)
所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!**
很多同学会以为二维数组在内存中是一片连续的地址,其实并不是。
这里面试中数组相关的理论知识就介绍完了。
后续我将介绍面试中数组相关的五道经典面试题目,敬请期待!
-------------------------
* 公众号:[代码随想录](https://img-blog.csdnimg.cn/20210210152223466.png)
* B站[代码随想录](https://space.bilibili.com/525438321)
* Github[leetcode-master](https://github.com/youngyangyang04/leetcode-master)
* 知乎:[代码随想录](https://www.zhihu.com/people/sun-xiu-yang-64)
![](https://img-blog.csdnimg.cn/20210416110157800.png)