将字符**转换为字符[x][x] 在C++中,我希望我的类有一个char **字段,它将根据用户的输入大小来调整大小。基本上,我想做这样的事情- char** map; map = new char[10][10];

将字符**转换为字符[x][x] 在C++中,我希望我的类有一个char **字段,它将根据用户的输入大小来调整大小。基本上,我想做这样的事情- char** map; map = new char[10][10];,c++,arrays,pointers,char,multidimensional-array,C++,Arrays,Pointers,Char,Multidimensional Array,10是任意整数。我收到一个错误,说无法将char*[10]转换为char**。既然我可以这样做,为什么它不能这样做呢- char* astring; astring = new char[10]; ?多维数组不支持这种方式。您需要分别分配这两个维度 char** map = new (char*)[10]; for( int i = 0; i < 10; ++i ) { map[i] = new char[10]; } char**map=new(char*)[10]; 对于(i

10是任意整数。我收到一个错误,说无法将char*[10]转换为char**。既然我可以这样做,为什么它不能这样做呢-

char* astring;
astring = new char[10];

多维数组不支持这种方式。您需要分别分配这两个维度

char** map = new (char*)[10];

for( int i = 0; i < 10; ++i ) {
  map[i] = new char[10];
}
char**map=new(char*)[10];
对于(int i=0;i<10;++i){
map[i]=新字符[10];
}

因为数组不是指针。数组衰变为指向其第一个元素的指针,但这只发生在第一级:二维数组衰变为指向一维数组的指针,但就是这样,它不会衰变为指向指针的指针

operator new[]
允许分配仅在运行时已知大小的动态数组,但只允许分配1D数组。如果要分配动态2D数组,需要分两步进行:首先分配指针数组,然后为每个指针分配另一个1D数组。例如:

char **map = new char*[10];  // allocate dynamic array of 10 char*'s
for(int i = 0; i < 10; i++)
    map[i] = new char[10];  // allocate dynamic array of 10 char's
char**map=new char*[10];//分配10个字符*的动态数组
对于(int i=0;i<10;i++)
map[i]=新字符[10];//分配10个字符的动态数组
然后,要释放阵列,必须反向释放所有内容:

for(int i = 0; i < 10; i++)
    delete [] map[i];
delete [] map;
for(int i=0;i<10;i++)
删除[]地图[i];
删除[]地图;

另一方面,什么是

map = new char[x][y];
真正要做的是,您可以创建一个包含x项的新数组,其类型是包含y项的数组。y必须是常量整数

因此,如果您真的希望代码能够顺利通过,正确的方法是

char (* map)[10] ;
map = new char[some_value_you_want][10];
或者更清楚地说

typedef char array10[10];
array10 * map = new array10[some_value_you_want];

二维数组衰减为指向一维数组的指针
-->您的意思是:“二维数组衰减为指向其第一个元素的指针”@Mehrdad:是的,与所有数组一样,二维数组衰减为指向其第一个元素的指针,在本例中恰好是一维数组。
char[10][10]
衰减为
char(*)[10]
,这是一个“指向10个字符数组的指针”。但这并不会退化为
字符**
,因为它不是数组类型,而是指针类型。@Adam:Oops,我的坏;我认为它会退化成一个
字符**
,因为它们都是连续的。不过,你知道为什么没有吗?它们不是都是连续的吗?@Mehrdad:是的,它们都是连续的。如果您有一个包含10个内容的数组,那么这10个内容将连续存储在内存中。如果将指针指向其中一个对象,则可以通过将指针增减
sizeof(Thing)
在数组中来回移动。在
char x[10]
的情况下,
Thing
char
sizeof(Thing)
是1;在
charx[10][10]
的情况下,
Thing
char[10]
,而
sizeof(Thing)
是10。(续)语法
a[b]
相当于
*(a+b)
。当你说
x[i][j]
(对于定义为
char x[10][10]
)的
x[i][j]
,编译器将其转换为“将指针指向
x
(类型为
char(*)[10]
)的第一个元素,添加
i*sizeof(char[10])=i*10
字节以计算
x[i]
。然后,取消对其引用(要获得
char[10]
)并添加
j*sizeof(char)=j
字节,然后取消引用以获得
x[i][j]
“虽然这可能是一个很好的家庭作业(您需要知道),但您可能应该使用stl类型来解决此问题。因此,一旦您知道这是如何工作的。请废弃代码并学习std::vector/string:)