I think you will find the documentation at multidimensional-arrays-c helpful to understand how the addresses of array rows and elements are determined.
And an example -
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int aInts[5][2] = {
{1,2},
{3,4},
{5,6},
{7,8},
{9,10}
};
int Rows = _countof(aInts);
int Cols = _countof(aInts[0]);
printf("Before move\n");
for (int r = 0; r < Rows; ++r)
for (int c = 0; c < Cols; ++c)
printf("aInts[%d][%d] = %d\n", r, c, aInts[r][c]);
int* dest = aInts[2]; // address of row 3
int* source = aInts[3]; // address of row 4
SIZE_T cBytes = 2 * sizeof(int[2]); // number of rows * size of a row
MoveMemory(dest, source, cBytes);
printf("\nAfter move overwriting row 3\n");
for (int r = 0; r < Rows; ++r)
for (int c = 0; c < Cols; ++c)
printf("aInts[%d][%d] = %d\n", r, c, aInts[r][c]);
return 0;
}