一. 简介:
首先,我们来看一个二维数组,如下图:
我们分别用符号代替文字:
- 行数:M
- 列数:N
- 行号:i
- 列号:j
左边的二维数组就可以看成是M * N,M = 4,N = 3
9这个元素就可以看成(i,j)=(2,1)
同时,[M-1][N-1]可以当做二维数组的维数,该二维数组可以表示为a[3][2]
二. 行优先
我们将二维数组的所有元素按照列向量依次排行排列,第i + 1 个行向量紧跟在第i个行向量后面,就能得到数组元素存入一维数组的线性序列,如下图:
二维数组中第(i,j)个元素,在一维数组的中的位置是:(i * N) + j,内存地址为:a + (i * N + j) * L
其中L是元素的内存占用空间(int为4,double为8……)
比如9这个元素,在二维数组中位置是(2,1),则在一维数组中的位置是(2 *3)+ 1 = 7,可以看到在一维数组中9的下标为7
三. 列优先
我们将二维数组的所有元素按照列向量依次排行排列,第j + 1 个列向量紧跟在第j个列向量后面,就能得到数组元素存入一维数组的线性序列,如下图:
二维数组中第(i,j)个元素,在一维数组的中的位置是:(j * M) + i,内存地址为:a + (j * M + i) * L
其中L是元素的内存占用空间(int为4,double为8……)
比如9这个元素,在二维数组中位置是(2,1),则在一维数组中的位置是(1 * 4)+ 2 = 6,可以看到在一维数组中9的下标为6
四. 代码实现
#include <stdio.h> int main() { int a[3][2]; printf("%X\n",a);//输出a的地址 printf("%X\n",&a[2][1]); //M = 3,N = 2, i = 2,j = 1 int c = (int ) a + (2 * 2 + 1) * sizeof(int); //a + (i * N + j) * L printf("%X\n",c); //输出行优先下,a[2][1]的内存地址 int d = (int ) a + (1 * 3 + 2) * sizeof(int); //a + (j * M + i) * L printf("%X\n",d); //输出列优先下,a[2][1]的内存地址 return 0; } 输出: 60FEF0 60FF04 60FF04 60FF04
请登录之后再进行评论