我有这个任务,我需要声明并使用动态分配的矩阵。它被初始化为具有已知数据的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;
}
答案 0 :(得分:1)
int**
表示指针指针。直接位于存储器中的2维矩阵(即在memroy中当前行之后放置的下一行)。因此,如果您尝试取消引用此指针,您将获得值,但不是指针。
你应该逐行复制矩阵或为整个数组分配一个内存。
答案 1 :(得分:0)
指针与数组不同,数组由编译器分配所有元素,并且在编译时它的大小是已知的(静态大小)指针是一个地址,[]
运算符允许你取消引用就好像它是一个数组,但事实并非如此。这个以及数组名称作为指向它的第一个元素的指针的事实使得新手推断它们是同一个东西。
数组和指针不是同一个东西 double matrix[7][7];
之类的内容与double **matrix;
和double *matrix[7];
完全不同。第一个是由七个double
组成的七个数组的数组,第二个是指向double
指针的指针,第三个是指向double
的七个指针的数组。
指针算法允许您移动指针,就像它们迭代数组一样,但这并不意味着它们是等价的。您可以移动指针,但不能移动数组。
最后,如果您尝试获取sizeof
,那么您将获得:
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函数形式参数中的指针,因此当您看到double param_matrix[][]
表示未指定的二维数组时,编译器实际上将参数更改为等效double **param_matrix
(并且它也不像二维数组那样)