C/C++学习笔记:二维数组

By AverageJoeWang
 标签:

一.引子

二维数组是用到比较多的高维数组,一维数组可以视作一行数据,二维数组在我看来更是一个表格,既有数据行又有数据列。

二.二维数组

2.1.声明与初始化

初始化分为2种

  • 按行初始化
int a[3][4] = {
    {0,1,2,3},
    {4,5,6,7},
    {8,9,10,11}
};
  • 顺序初始化
int a[3][b] = {0,1,2,3,4,5,6,7,8,9,10,11};
  • 二维数组在声明时候只能第一个参数可以省略,第二个参数不能省略

2.2.动态声明

声明

int **a = new int* [m];
for(int i = 0; i < m; i++)
    a[i] = new int [n];
  • 相当于一个二维数组a[m][n]
  • 动态声明的数组任意的a[k]都是一个int*类型
  • 只能通过a[i][j]或者((a+i)+j)来访问数组的元素,不能a[i*n+j]

释放动态声明的数组方法为

for(int i = 0; i < m; i++)
    delete [] a[i];
delete [] a;

三.行优先存储与列优先存储

3.1.行优先存储

  • 先将二维数组的第一行按照顺序存储
  • 接着第二行数据按照顺序存储
  • 以此排列

行优先存储的公式为

a[x][y] = b[x*列数 + y]

3.2.列优先存储

  • 先将二维数组第一列按顺序存储
  • 接着第二列按顺序存储
  • 以此排列

列优先存储的公式为

a[x][y] = b[y*行数 + x]

在C/C++中,默认是按照行优先顺序连续存储的

3.3.例子

有一个二维数组a[1…100,1…65]有100行和65列,我们以行优先存储,如果该数组的基址是10000,且每个元素占用2个存储单元,请问a[56,22]的存储地址是()?

10000 + ((56-1)65 + (22-1))2 = 17192