如何使用指针初始化2D数组。
int *mapTable[] = { {1,10} , {2,20} , {3,30} , {4,40} }; // It's giving error
此处int *mapTable
发出错误。
我如何正确申报?
答案 0 :(得分:7)
int *mapTable[]
不是2D数组:它是指针的一维数组。
然后你去使用2D数组初始化{ {1,10} , {2,20} , {3,30} , {4,40} }
。
这就是为什么它“给出错误”。
尝试:
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} };
这两个都使用了数组引用衰减为指针的事实。