C++ 动态分配的矩阵不会获取指向指针的指针

C++ 动态分配的矩阵不会获取指向指针的指针,c++,matrix,dynamic-allocation,C++,Matrix,Dynamic Allocation,我需要在需要声明和使用动态分配矩阵的地方执行此任务。它被初始化为一个7X7的网格,包含如下所示的已知数据 我尝试了至少一千种不同的方法,但每次编译器都无法得到它,它会提醒我将int[]]转换为int**时出现问题。我添加了一个截图的代码,希望能得到一些帮助 #include <cstdlib> #include "Map.h" typedef int size_type; typedef int** grid_type; grid_type ppGrid; size_type siz

我需要在需要声明和使用动态分配矩阵的地方执行此任务。它被初始化为一个7X7的网格,包含如下所示的已知数据

我尝试了至少一千种不同的方法,但每次编译器都无法得到它,它会提醒我将int[]]转换为int**时出现问题。我添加了一个截图的代码,希望能得到一些帮助

#include <cstdlib>
#include "Map.h"
typedef int size_type;
typedef int** grid_type;
grid_type ppGrid;
size_type size_h;
size_type size_w;

int mapInitializer[7][7]=
        {
        { 0 , 1 , 1 , 1 , 1 , 1 , 1},
        { 1 , 2 , 2 , 0 , 1 , 0 , 1},
        { 0 , 0 , 1 , 1 , 1 , 2 , 1},
        { 1 , 0 , 0 , 0 , 0 , 0 , 1},
        { 1 , 1 , 1 , 2 , 1 , 0 , 1},
        { 1 , 0 , 0 , 0 , 0 , 2 , 1},
        { 1 , 0 , 1 , 1 , 1 , 1 , 1}
        } ;

Map::Map(){
    grid_type ppGrid;
    realloc(ppGrid,7);
    for(int i=0;i<7;i++){
        realloc(ppGrid[i],7);
    }
    ppGrid=mapInitializer;
}
int**表示指针对指针。直接位于内存中的二维矩阵,即内存中当前行之后的下一行。所以,若你们尝试去引用这个指针,你们将得到值,但并没有指针。
您应该逐行复制矩阵或为整个数组分配一个内存。

指针与数组不同,一个数组由编译器分配其所有元素,其大小在编译时是已知的静态大小指针是地址,[]运算符允许您像解引用数组一样解引用,但它不是。这一点以及数组名作为指向其第一个元素的指针的事实使得新手推断它们是同一个东西

数组和指针不是一回事,就像双矩阵[7][7];与双**矩阵完全不同;并加倍*矩阵[7];。第一个是由七个双精度数组组成的数组,第二个是指向指向双精度的指针的指针,第三个是指向双精度的七个指针的数组

指针算法允许您将指针移动到迭代数组的位置,但这并不意味着它们是等价的。可以移动指针,但不能移动数组

最后,如果您尝试获取这些的大小,您将获得:

sizeof (double [7][7]) /* seven times the sizeof of an array of seven doubles == 49 times the sizeof a double */
sizeof (double *[7]) /* seven times the sizeof an array of seven pointers to double == 7 times the size of a pointer */
sizeof (double **) /* the sizeof a pointer to pointer to double == the size of a pointer */

更让新手感到不安的是编译器总是将数组引用转换为C函数形式参数中的指针,因此当您看到双参数矩阵[][]表示未指定的二维数组时,编译器实际上会将参数更改为等效的双**param_矩阵,并且它的行为也不会像二维数组一样

1的可能副本如果您关心指针类型,请不要将指针类型隐藏在typedef后面。这是指针最容易出错的方法。2双指针不是2d数组,不能只将2d数组类型的变量分配给双指针。这些是不兼容的类型。3使用std::vector,而不是自己管理内存。4一次复制一行。5下次将代码作为文本而不是图像发布。我们无法将图像复制到编译器中以检查代码。@StoryTeller嗨,谢谢!用实际代码而不是图片更新帖子。遗憾的是,我必须使用typedef,不能使用向量。我希望我能。任何事情都应该在动态分配矩阵中发生。@RoniZaitsev-严格来说,std::vector也会进行动态分配。它是由C++专家编写的。作为for循环,它也是语言不可分割的一部分。如果你不能使用它,不要使用,但第4项仍然有效。我还建议将内存管理移到一个单独的类中,如果你明白我的意思,Map将保存一个名为GridMemory的东西。最后,如果你的老师坚持使用typedef,他们会让你失败。当然,我讨厌这里使用typedef,它只会让事情变得更糟,但我对此不能说什么。向量也是一样,如果我能的话。谢谢你,我现在正在尝试。我试图为整个阵列分配一个内存,但我找不到一种方法让它接受ppGrid,因为它之后会这样做。无论我做什么,它都不会接受int**和int[][]之间的任何比较