笔记学习:代码随想录 (programmercarl.com)
数组
数组是存放在连续内存空间上的相同类型数据的集合。
注意:
- 数组下标都是从0开始的。
- 数组内存地址连续。
缺点:
(1)因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
(2)数组的元素是不能删的,只能覆盖(比如通过赋值语句,直接覆盖;若直接删除后再增加该值,则需要移动别的元素,十分复杂)。
那么二维数组在内存的空间地址是连续的么?
不同编程语言的内存管理是不一样的。
C++中二维数组在地址空间上是连续的。
这种连续存储的方式有助于提高内存访问的效率,因为可以通过简单的指针运算来访问数组的元素。
C、C++ 和 Fortran支持以连续方式存储二维数组。这些语言中的二维数组在内存中是以行主序(C 连续方式)或列主序(Fortran 连续方式)存储的。这种连续存储的方式可以提供更高的内存访问效率,尤其是在进行大规模的数值计算时。
Java的二维数组不连续。
Python 中的普通二维数组(列表的列表)在内存中不是连续存储的,但使用 NumPy 创建的数组可以在内存中以连续方式存储。
Python 中的二维数组是通过列表的列表(列表嵌套)来表示的,而不是使用连续的内存块。这是因为 Python 的列表是动态的,可以容纳不同长度的元素。每个内部列表都是一个独立的对象,它们在内存中可以分散存储,而不一定是连续的。
这种设计选择在某些情况下提供了更大的灵活性,但也带来了一些性能上的开销。由于二维数组的元素不是连续存储的,访问数组的特定元素可能需要更多的指针解引用操作,从而导致一些额外的开销。
为什么前面说数组内存地址连续,但是不同语言的二维数组内存地址可能不连续?
一维数组的内存地址是连续的。在内存中,一维数组的元素按照其顺序依次存储,相邻元素之间没有间隔。因此,数组中的第一个元素的内存地址是最小的,而最后一个元素的内存地址是最大的。这种连续存储的方式使得我们可以通过下标来访问数组中的元素,并且可以通过简单的地址计算来定位数组中的任意元素。
例如,假设有一个整数数组 `arr
`,它包含 4 个元素 `[10, 20, 30, 40]
`。如果 `arr
` 的起始内存地址为 `0x1000
`,那么按照连续存储的原则,`arr[0]
` 的内存地址为 `0x1000
`,`arr[1]
` 的内存地址为 `0x1004
`,`arr[2]
` 的内存地址为 `0x1008
`,`arr[3]
` 的内存地址为 `0x100C
`。可以看到,每个元素的内存地址相对于前一个元素的地址增加了固定的偏移量(在这个例子中是 4 个字节,因为一个整数占用 4 个字节的内存空间)。
这种连续存储的方式使得数组在内存中的访问更加高效,因为可以通过简单的地址计算来确定元素的位置。但同时也要注意,一维数组的连续存储要求所有元素的类型和大小相同,且数组的长度在创建时是固定的。