c语言将二维数组当做一维数组传入函数,并能输出原二维数组的各元素,怎样理解?

c语言将二维数组当做一维数组传入函数,并能输出原二维数组的各元素,怎样理解?

二维数组是连续存放的,可以当作一维数组

#include <stdio.h>

void printarr(int * arr, int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d ", arr[i * n + j]);
        }
        printf("\n");
    }
}

int main()
{
    int arr[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
    printarr(&arr[0][0], 3, 2);
    return 0;
}

二维数组是逻辑意义上的二维,物理意义上的一维(并不严谨)。
例如:int a[5][8];,那么你可以首先看作一个大的数组:a[5],那么里面的元素如何呢?每一个元素都是一个长度为8的数组。当然这是逻辑意义上的。物理意义上可以这么理解:
|00000000|00000000|00000000|00000000|00000000|
其中0是每一个int单元,每一个|00000000|代表了一个大的包含有8个int的单元。我也是小白,这个是我自己理解的,不太严谨。