C++多维数组如何在幕后工作
C++ How multi-dimensional arrays works behind the scenes
我是C++的新手,正在努力理解一件重要的事情。我听说所有数组都只是指针别名,[]
运算符执行的每个操作都转换为指针解引用。请参见下面的示例(动态数组)。
auto **tab = new int*[2];
tab[0] = new int[2];
tab[1] = new int[2];
tab[0][0] = 1;
tab[0][1] = 2;
tab[1][0] = 3;
tab[1][1] = 4;
cout << "tab[0] address: " << &tab[0] << " with value: " << tab[0] << endl;
cout << "tab[1] address: " << &tab[1] << " with value: " << tab[1] << endl;
cout << "tab[0][0] address: " << &tab[0][0] << " with value: " << tab[0][0] << endl;
cout << "tab[0][1] address: " << &tab[0][1] << " with value: " << tab[0][1] << endl;
cout << "tab[1][0] address: " << &tab[1][0] << " with value: " << tab[1][0] << endl;
cout << "tab[1][1] address: " << &tab[1][1] << " with value: " << tab[1][1] << endl;
delete[] tab[0];
delete[] tab[1];
delete[] tab;
这是一个非常简单的程序,它展示了如何在内存中表示指针对指针。它返回以下结果:
tab[0] address: 0x7114d0 with value: 0x7114e0
tab[1] address: 0x7114d4 with value: 0x7114f0
tab[0][0] address: 0x7114e0 with value: 1
tab[0][1] address: 0x7114e4 with value: 2
tab[1][0] address: 0x7114f0 with value: 3
tab[1][1] address: 0x7114f4 with value: 4
注意:我完全理解它的工作原理。我有两个基本地址,它们指向其他第二个地址。结果,解引用tab[0]
将存储器地址返回到第二维度。伪代码:
*(0x7114d0) = 0x7114e0 -> 1
但是第二个例子展示了静态数组是如何工作的。
int tab[2][2] = {{1,2}, {3,4}};
cout << "tab[0] address: " << &tab[0] << " with value: " << tab[0] << endl;
cout << "tab[1] address: " << &tab[1] << " with value: " << tab[1] << endl;
cout << "tab[0][0] address: " << &tab[0][0] << " with value: " << tab[0][0] << endl;
cout << "tab[0][1] address: " << &tab[0][1] << " with value: " << tab[0][1] << endl;
cout << "tab[1][0] address: " << &tab[1][0] << " with value: " << tab[1][0] << endl;
cout << "tab[1][1] address: " << &tab[1][1] << " with value: " << tab[1][1] << endl;
与前面的例子相同,我得到的结果是:
tab[0] address: 0x28fea0 with value: 0x28fea0
tab[1] address: 0x28fea8 with value: 0x28fea8
tab[0][0] address: 0x28fea0 with value: 1
tab[0][1] address: 0x28fea4 with value: 2
tab[1][0] address: 0x28fea8 with value: 3
tab[1][1] address: 0x28feac with value: 4
在这一点上,我遇到了一个巨大的问题,如何理解这一点,因为取消引用"tab[0]"会返回"tab[0]"的地址,该地址也包含值(1)。。。伪码
*(0x28fea0) = 0x28fea0 -> 1
现在你怎么理解它在内存中,静态和动态多维数组似乎有两种不同的处理方式。如果数组实际上是指针,那么通过tab[0]
处理自己的地址(下面的伪代码),静态数组去引用是如何工作的。。。
2D数组和指针数组是不同的动物,即使它们的语法相同。
这是一个指向数组的指针数组:
auto **tab = new int*[2];
tab[0] = new int[2];
tab[1] = new int[2];
tab
是一个指针数组,tab
的每个元素都指向行,但这些行是相互独立分配的,并且不一定是连续的。理论上,它们甚至可以有不同的大小,这在C字符串数组中很常见。
这是一个2D阵列:
int tab[2][2];
它是一个数组。这里要求行具有相同的大小并连续分配:&tab[0][2]
要求与&tab[1][0]
相同
但is完全独立于静态或动态分配。这是一个静态的指针数组:
int row1[2] = { 0, 1};
int row2[2] = { 2, 3};
int *tab[] = { row1, row2 }; // row1 and row2 decay to pointers to their first element;
这是一个动态分配的2D阵列:
typedef int iarr2[2];
iarr2* dyntab = new iarr2[2];
相关文章:
- 将返回值存储在函数指针数组的指针中是如何工作的?
- std::数组边界检查如何工作?
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么指针在对二维数组进行排序时无法正常工作?
- C++中循环和 C 样式数组的范围工作
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 为什么必须动态分配扩展数组才能使此功能正常工作C++
- 我正在努力处理多维数组输入和输出,我管理输入,但是打印无法按计划工作
- 将类型化数组写入子进程 stdin 无法正常工作
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- 如果带有字符数组的语句无法正常工作
- 使用 for 循环打印字符串数组无法正常工作 (C++)
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 澄清了 strcpy() 在像这样初始化字符数组时的工作 *Arr.
- 在 C++ 中使用递归填充 D2 数组,有时工作正常,其他时会引发异常
- 为什么C ,Devstudio,数组索引工作
- 构建对象数组是如何工作的?我被这个例子困住了
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 我用于汇总数组元素的 c++ 代码无法正常工作