Mav*_*ick 3 c++ memory arrays memory-management new-operator
我在下面看到了以下代码,我有点困惑.
int**** m_ppppCoder;
m_ppppCoder = new int ***[10];
Run Code Online (Sandbox Code Playgroud)
这是一个动态分配的3维int数组吗?有人可以准确解释,它是如何工作的?
阅读注释后添加:上面的声明本身不是一个完整的3d int数组,而是具有数组创建第一步的声明结构.根据这一点,使用下面的代码,您可以动态创建一个3d数组.那是对的吗 ?
m_ppppCoder[0] = new int **[10];
m_ppppCoder[0][0] = new int *[10];
m_ppppCoder[0][0][0] = new int[10];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,实际数据如何在存储器内排列(分配),即顺序?
这是一个动态分配的3维int数组吗?
没有.
Run Code Online (Sandbox Code Playgroud)int**** m_ppppCoder
m_ppppCoder 是指向指向整数指针的指针的指针.
Run Code Online (Sandbox Code Playgroud)m_ppppCoder = new int * **[10];
m_ppppCoder 指向动态分配的10个指针数组的第一个元素,该指针指向指向整数的指针.
有人可以准确解释,它是如何工作的?
好吧,它是一个指向数组元素的指针,所以它本身并没有做太多的工作.用法示例:
int i = 42; // an integer i
int *ii = &i; // ii points to i
int **iii = ⅈ // iii points to ii
m_ppppCoder[0] = &iii; // the first element points to iii
int j = ****m_ppppCoder[0]; // the value of j is now 42
delete[] m_ppppCoder; // never forget to delete dynamic memory
Run Code Online (Sandbox Code Playgroud)
可能没有很好的实际用途int****.
Run Code Online (Sandbox Code Playgroud)m_ppppCoder = new int ***[10]; m_ppppCoder[0] = new int **[10]; m_ppppCoder[0][0] = new int *[10]; m_ppppCoder[0][0][0] = new int[10];在这种情况下,实际数据如何在存储器内排列(分配),即顺序?
像这样:
pointer to int*** p
|
an array of 10 int*** |->[0][1][2][3]...
|
an array of 10 int** |->[0][1][2][3]...
|
an array of 10 int* |-> [0][1][2][3]...
|
an array of 10 int |-> [0][1][2][3]...
Run Code Online (Sandbox Code Playgroud)
这很简单.您已分配4个阵列.由于它们是单独的分配,因此这4个阵列中的每一个都在免费存储中的某个位置彼此分开.
数组的元素本身在内存中是连续的.因此,每个指针(或最后一个指针中的整数)在存储器中相对于同一阵列的其他元素是连续的.
请注意m_ppppCoder[x],m_ppppCoder[0][x]并且m_ppppCoder[0][0][x]是[1,10]中所有x的未初始化指针.