从头学C(51)指针与多维数组

0

如果不多加注意,是很容易混淆二维数组和指针数组的。

第五章 指针与数组 >> 5.9 指针与多维数组

如下定义:

int a[10][20];    /* 定义了一个二维数组 */
int *b[10];       /* 定义了一个指针数组 */

从语法角度来说, a[3][4] 和 b[3][4] 对一个 int对象的合法访问,然而:

  1. a 是一个真正的二维数组,它被分配了 200 个 int 类型长度的存储空间。通过常规的矩阵下标计算公式 20 * row + col(其中 row 表示行,col 表示列)可以计算元素 a[ row ] [ col ] 的位置;
  2. 对 b 来说,该定义仅仅分配了 10 个指针,并没有初始化,在使用它们之前必须先进行显式的初始化(如静态初始化或通过代码初始化)。

假如 b 的每个元素都指向一个具有 20 个元素的数组,那么编译器需要为它分配 200 个 int 类型长度的存储空间,以及 10 个指针的存储空间。但是 b 的每个元素不一定需要都指向一个具有 20 个元素的数组,所以我们可以看到指针数组的一个优势在于:数组的每一个行长度可以不同。事实上,指针数组用的比较频繁的就是用于存放不同长度的字符串,比如上一章节的 month_name。

接下来我们结合变量定义和图形化描述,来对指针数组和二维数组进行一个直观的比较。先看指针数组的定义和图形描述:

char *name[] = {"Illegal month", "Jan", "Feb", "Mar"};

C语言_指针数组_图示

以下是二维数组的定义和图形描述:

char aname[][15] = {"Illegal month", "Jan", "Feb", "Mar"};

C语言_二维数组_图示

可以看到尽管二维数组中有的字符串不满 15 个字符,但它们仍然占据着 15 个 char 类型的存储空间。

Leave A Reply