在C++中,二维数组在内存中是按行优先顺序(Row-major order)连续存储的。这意味着数组的每一行依次排列在内存中,前一行的最后一个元素紧挨着下一行的第一个元素。
二维数组的内存布局以一个 int arr[3][4] 为例,它是一个3行4列的整型数组。尽管从语法上看是“二维”,但它在内存中是连续的一块空间,总共占用 3×4=12 个 int 类型大小的空间。
元素的排列顺序如下:
- arr[0][0], arr[0][1], arr[0][2], arr[0][3]
- arr[1][0], arr[1][1], arr[1][2], arr[1][3]
- arr[2][0], arr[2][1], arr[2][2], arr[2][3]
内存地址从低到高依次递增,没有间隔。
如何验证连续存储可以通过打印元素地址来验证这一点:
#include <iostream> using namespace std; <p>int main() { int arr[3][4] = {0}; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { cout << &arr[i][j] << " "; } cout << endl; } return 0; }</p>
输出的地址会显示每个元素紧挨着前一个,且每行结束后直接接下一行第一个元素的地址,说明是完全连续的。
与指针和动态数组的区别这种连续存储只适用于静态定义的二维数组(如 int arr[3][4])。如果是用指针数组动态创建的二维数组(如 int** arr),每一行可能分配在不同的内存块中,不保证整体连续。
但静态二维数组可以被当作一维数组来访问:
- (int*)arr 是数组首地址
- arr[i][j] 等价于 *(((int*)arr) + i * 4 + j)
这种特性常用于需要将二维数组传给期望一维指针的函数。
基本上就这些。C++的二维数组本质是“数组的数组”,内层是连续的,外层也是连续的,因此整体连续存储。理解这一点对内存操作、指针遍历和性能优化都很有帮助。
以上就是C++二维数组在内存中是如何连续存储的的详细内容,更多请关注知识资源分享宝库其它相关文章!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。