当我们在:
中定义2D数组时int *a[5];
“5”定义了哪个维度?第一个还是第二个?
答案 0 :(得分:5)
这不是“2D”阵列。它是指向int
的一维指针数组。因此,数组大小指定它具有5个指针的空间。每个单独的指针都可以指向不同大小的缓冲区的第一个元素。
“真正的2D数组”是口语“数组数组”int a[M][N]
。这里,表达式a[i]
计算位置N
的{{1}}整数数组。
答案 1 :(得分:2)
每个a[i]
指向一个int
,它可能是int
个对象序列中的第一个元素,如下所示:
a[0] a[1] a[2] a[3] a[4]
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| | | | |
| | | ... ...
| | +-------------------------------+
| +-------------------+ |
+-------+ | |
| | |
v v v
+---+ +---+ +---+
a[0][0] | | a[1][0] | | a[2][0] | |
+---+ +---+ +---+
a[0][1] | | a[1][1] | | a[2][1] | |
+---+ +---+ +---+
... ... ...
因此,每个a[i]
都可以代表您结构中的“行”。您可以将每个“行”动态分配为
a[i] = malloc( sizeof *a[i] * row_length_for_i );
或者您可以将其设置为指向现有数组:
int foo[] = { 1, 2, 3 };
int bar[] = { 5, 6, 7, 8, 9 };
...
a[0] = foo;
a[1] = bar;
如上例所示,每个“行”可能有不同的长度。
我一直把恐慌引用放在“行”周围,因为你所拥有的并不是真正的2D数组 - 它不是连续的元素序列。紧跟在a[0][N-1]
之后的对象很可能不会为a[1][0]
。你拥有的是一系列指针,每个指针可能指向int
序列的第一个元素,或指向单个int
,或者根本不指向任何指针