#define TElem int
#define M 2
#define N 3
TElem a[M][N] // массив массивов
= {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
TElem (*b)[N] = &a[0]; // указатель на массив
/* // то же самое,
TElem (*b)[N] = a; // но короче
*/
TElem *c[M] = {a[0], a[1]}; // массив указателей
TElem **d = &c; // указатель на указатель
#include <stdio.h>
int main(void) {
TElem x;
#define i 1
#define j 2
puts("X[i][j]");
x = a[i][j]; printf("%d\n", x);
x = b[i][j]; printf("%d\n", x);
x = c[i][j]; printf("%d\n", x);
x = d[i][j]; printf("%d\n", x);
puts("(*(X + i))[j]");
x = (*(a + i))[j]; printf("%d\n", x);
x = (*(b + i))[j]; printf("%d\n", x);
x = (*(c + i))[j]; printf("%d\n", x);
x = (*(d + i))[j]; printf("%d\n", x);
puts("*(X[i] + j)");
x = *(a[i] + j); printf("%d\n", x);
x = *(b[i] + j); printf("%d\n", x);
x = *(c[i] + j); printf("%d\n", x);
x = *(d[i] + j); printf("%d\n", x);
puts("*(*(X + i) + j)");
x = *(*(a + i) + j); printf("%d\n", x);
x = *(*(b + i) + j); printf("%d\n", x);
x = *(*(c + i) + j); printf("%d\n", x);
x = *(*(d + i) + j); printf("%d\n", x);
return 0;
}