关于在C

时间:2017-01-25 11:15:08

标签: c pointers multidimensional-array

当我们在:

中定义2D数组时
int *a[5];

“5”定义了哪个维度?第一个还是第二个?

2 个答案:

答案 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,或者根本不指向任何指针