2D指针初始化

时间:2011-06-24 08:58:52

标签: c++ c

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

int *mapTable[] = { {1,10} , {2,20} , {3,30} , {4,40} };  // It's giving error

此处int *mapTable发出错误。

我如何正确申报?

2 个答案:

答案 0 :(得分: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} };

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


一维指针方式

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

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

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];
}

如你所见,这并不理想。

您可以避免动态分配:

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] };

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

答案 1 :(得分:0)

questin标记为C ++和C;但所有这些答案只涵盖C ++(指针方式)。

因此,在C中,您可以单独声明行,然后组合它们。

int r0[] = {1,10}, r1[] = {2,20}, r2[] = {3,30}, r3[] = {4,40};
int *mapTable[] = { r0, r1, r2, r3 };

或者,使用C99,您可以在初始化程序中创建匿名数组。

int *mapTable[] = { (int[]){1,10}, (int[]){2,20}, (int[]){3,30}, (int[]){4,40} };

这两个都使用了数组引用衰减为指针的事实。