- N +

二维数组的详解 :

  二维数组在概念上是二维的,有行和列,但在内存中一切的数组元素都是延续摆设的,它们之间没有“裂缝”。

  要用数组指针来操作二维数组。int (*p)[4]=a; ?//p每移动一次就是移动了一个一维数组。

  ? ?指针数组:int *p=a[4];

  ? ? ? ? ? ? ? ? ? ? ?int *p([4]);

  以下面的二维数组 a 为例:

  int a[3][4]={ {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

  从概念上了解,a 的散布像一个矩阵:

  0 1 2 3

  4 5 6 7

  8 9? 10? 11

  但在内存中,a 的散布是一维线性的,全部数组占用一块延续的内存:

  

  C言语中的二维数组是按行摆设的,也就是先寄存 a[0] 行,再寄存 a[1] 行,最后寄存 a[2] 行;每行中的 4 个元素也是依次寄存。数组 a 为 int 类型,每个元素占用 4 个字节,全部数组共占用 4×(3×4)=48 个字节。

  C言语许可把一个二维数组分化成多个一维数组来处理。关于数组 a,它可以分化成三个一维数组,即 a[0]、a[1]、a[2]。每个一维数组又包罗了 4 个元素,例如 a[0] 包罗 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

  假定命组 a 中第 0 个元素的地址为 1000,那么每个一维数组的首地址以下图所示:

  

  为了更好的了解指针和二维数组的关系,我们先来定义一个指向 a 的指针变量 p:

  int (*p)[4]=a;

  括号中的*标明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包罗的每个一维数组的类型。

  [ ]的优先级高于*,( )是必须要加的,假设光溜溜地写作int *p[4],那么应当了解为int *(p[4]),p 就成了一个指针数组,而不是二维数组指针,这在《C言语指针数组》中曾经讲到。

  对指针停止加法(减法)运算时,它行进(前进)的步长与它指向的数据类型有关,p 指向的数据类型是int [4],那么p+1就行进 4×4=16 个字节,p-1就前进 16 个字节,这正好是数组 a 所包罗的每个一维数组的长度。也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。

  数组名 a 在表达式中也会被转换为和 p 等价的指针!

  下面我们就来寻找一下若何应用指针 p 来访问二维数组中的每个元素。依照下面的定义:

  1) p指向数组 a 的扫尾,也即第 0 行;p+1行进一行,指向第 1 行。

  2) *(p+1)表现取地址上的数据,也就是全部第 1 行数据。留心是一行数据,是多个数据,不是第 1 行中的第 0 个元素,下面的运转结果有力地证清晰明了这一点:

返回列表
上一篇:上一篇:【参考投资克日:24月以上标且湖北】p2p平台列表
下一篇:下一篇:没有了