【发布时间】:2011-11-04 06:14:23
【问题描述】:
这样声明多维数组有什么区别:
int a[5][5];
或者这个
int* a[5];
?
哪个更好用?谢谢。
【问题讨论】:
-
您可能会发现 cdecl.org 对于“解码”复杂的 C 声明很有用。
标签: c arrays multidimensional-array
这样声明多维数组有什么区别:
int a[5][5];
或者这个
int* a[5];
?
哪个更好用?谢谢。
【问题讨论】:
标签: c arrays multidimensional-array
两者都可以用于声明二维数组。
在第一种情况下,25 个 int 元素被分配在内存中的一个连续区域中。
在这种情况下,表达式a[i][j] 被编译器翻译成*(a + i*5 + j)。
第二个分配了5个指向int的指针。您可以通过分配int 的向量并使这些指针指向这些向量来使其作为二维数组工作。
在这种情况下,a[i][j] 表示获取a[i] 指向的指针,然后查找该向量中的第 5 个元素。 IE。 a[i][j] 被翻译成*(a[i] + j)。
请注意,在第二种情况下,行的长度不必相同。
【讨论】:
int a[5][5]; 表示编译器应该分配足够的内存来存储 25 个整数,并将其视为一个名为a 的二维数组。
int* a[5]; 表示编译器应该分配足够的内存来存储 5 个指向整数的指针,并将其视为一个名为 a 的指针数组。要将其实际用作二维数组,您必须分配更多内存并初始化这些指针以指向它。例如:
int * a[5];
for(int i = 0; i < 5; i++){ a[i] = malloc(sizeof(int) * 5); }
在不了解您的要求的情况下,很难说哪个更适合您。第二个允许您有效地交换两行并且通常更灵活,但它需要更多的代码来分配和释放数据结构。
【讨论】:
【讨论】:
苹果和橙子哪个好?
这个符号int a[ROWS][COLS]用于创建矩形二维数组,其维度在声明时是已知的。
当在 2D 数组声明时列数未知或列数在运行时可能变化或只想创建非矩形(锯齿状)数组时,使用此 int * a[ROWS] 表示法:
1 2 3 4
4 6
7 1 1 1 5 6 7
9
【讨论】: