2

Как работает 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));
        }
      }
Harry
  • 221,325
  • i*m + j-индекс как я понял,а a зачем – zer3pk42 Apr 22 '21 at 16:34
  • 1
    Просто почитайте арифметику указателей https://ru.stackoverflow.com/questions/1097364/c-Арифметика-с-адресами-памяти/1097366#1097366 – AlexGlebe Apr 22 '21 at 16:34
  • 4
    a + i*m + j == & ( a [ i*m + j ] ) – AlexGlebe Apr 22 '21 at 16:35
  • 1
    a — это не массив. Это указатель на первый элемент одномерного массива из n*m элементов типа int. К указателям можно прибавлять целые числа. Про смысл такой операции можете немного почитать в этом ответе. В вашем примере с одномерным массивом работают так, будто в нём хранится матрица из n строк и m столбцов. – wololo Apr 22 '21 at 21:21

1 Answers1

1

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

int a[M][N];

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

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

Mikhajlo
  • 12,592