【笔记】二维数组在内存地址中的存储

最近在学习STM32的ADC和DMA多通道采集过程中有使用到二维数组,姑且记录一下以作备忘。
参考:http://c.biancheng.net/view/2022.html


举个例子就能很简单的说明了
创建一个M行N列的int数组,数组定义如下(例:M=3 N=5)

#define M 3 
#define N 5
int arr[M][N];

给数组按顺序赋值

int (*p)[N] = arr;
for(int i=0; i<M*N; i++)
{
  *(*p+i) = i+1;  //按照数组在内存地址中的存储顺序依次赋值1~15
}

再将其按M行N列的格式打印出来

for(int i=0; i<M; i++)
{
  for(int j=0; j<N; j++)
  {
    printf("%4d ", arr[i][j]);
    if(j==N-1) printf("\n");
  }
}

结果为

   1    2    3    4    5 
   6    7    8    9   10 
  11   12   13   14   15 

小结

抽象得看二维数组是一个矩阵,按照从左至右,从上到下的顺序存储数值,实际上在内存中是连续一片的
反过来说,将连续一片的内存数据读取为二维数组,如果要按照通常的理解方式来,就应当一行一行的读。再具体一点:要读取M组N个数据,第一次读的N个数据作为二维数组的第一行、第二次读N个数据作为数组的第二行,以此类推最终得到一个M行N列的数组。

posted @ 2023-09-09 11:20  T3rra  阅读(162)  评论(0编辑  收藏  举报