2D指针初始化

Sij*_*ith 0 c c++

如何使用指针初始化2D数组.

int *mapTable[] = { {1,10} , {2,20} , {3,30} , {4,40} };  // It's giving error
Run Code Online (Sandbox Code Playgroud)

int *mapTable是一个错误.

我怎样才能正确申报?

Lig*_*ica 7

int *mapTable[] 不是2D数组:它是一维指针数组.

但是你去使用2D数组初始化器{ {1,10} , {2,20} , {3,30} , {4,40} }.

这就是它"给出错误"的原因.


2D阵列方式

尝试:

int mapTable[][2] = { {1,10} , {2,20} , {3,30} , {4,40} };
Run Code Online (Sandbox Code Playgroud)

而且,是的,您需要指定第二个维度的大小.


一维数组指针方式

这有点复杂,而且通常太复杂而不值得.

它通常还需要动态分配,导致对象生命周期完全混乱:

int *mapTable[] = { new int[2], new int[2], new int[2], new int[2] };

int main() {
   mapTable[0][0] = 1; mapTable[0][1] = 10;
   mapTable[1][0] = 2; mapTable[1][1] = 20;
   mapTable[2][0] = 3; mapTable[2][1] = 30;
   mapTable[3][0] = 4; mapTable[3][1] = 40;

   // then, at the end of your program:
   for (size_t i = 0; i < 4; i++)
      delete[] mapTable[i];
}
Run Code Online (Sandbox Code Playgroud)

如你所见,这并不理想.

您可以避免动态分配:

int mapTable0[] = {1,10};
int mapTable1[] = {2,20};
int mapTable2[] = {3,30};
int mapTable3[] = {4,40};
int *mapTable[] = { &mapTable0[0], &mapTable1[0], &mapTable2[0], &mapTable3[0] };
Run Code Online (Sandbox Code Playgroud)

但我不确定你为什么要走这条大道.

  • @Cicada:**数组是_not_指针**.请停止传播这种危险的错误信息. (4认同)
  • @Soltys:不,[他们完全没有](http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c).这完全是胡说八道. (4认同)
  • @Soltys:不,他们不是.在适当的情况下,数组的名称可以衰减为一个右值类型的右值,但是即使这样,数组肯定是*不是指针.将其称为指针就像调用`1`和`int`变量一样.它是一个可以赋给`int`变量的值,但它本身并不是一个`int`变量. (4认同)
  • @Soltys:[如何在C++中使用数组?](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c). (2认同)