СИ двумерные массивы

Как работает scanf("%d", (a + i*m + j));? Если a-массив, то как мы можем к нему прибавить im+j

// Выделение памяти
      a = (int*)malloc(n*m * sizeof(int));
      // Ввод элементов массива
      for (i = 0; i<n; i++)  // цикл по строкам
      {
        for (j = 0; j<m; j++)  // цикл по столбцам
        {
          printf("a[%d][%d] = ", i, j);
          scanf("%d", (a + i*m + j));
        }
      }

Ответы (1 шт):

Автор решения: Mikhailo

Двумерный массив

int a[M][N];

располагается в памяти одним блоком построчно. К элементу a[i][j] молжно обратиться и как к &a[0][0]+i*N+j - пропускаем i строк по N элементов и в строке обращаемся к j-му элементу.

То же можно сымитировать динамически, выделяя достаточную память (для M*N элементов) и обращаясь к a+i*N+j, потому что a и есть указатель на самый первый элемент.

→ Ссылка