@LevSvl08

Почему именно при таком обращении к матрице мы получаем все ее элементы?

Я вывожу каждый элемент матрицы в консоль следующим образом:,
for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++)
        {
            cout << *(*(matrix + i) + j);
        }
        cout << endl;
    }
, но я не могу понять логику данного выражения. Ведь matrix + i - это указатель, значит, *(matrix + i) - это значение элемента. Тогда *(matrix + i) + j- это сумма значения и переменной j. В таком случае, *(*(matrix + i) + j) - это указатель. Я понимаю, что где-то в моей логике есть брешь. Скажите, пожалуйста, что я не уловил? Что мы получаем на каждом этапе данного действия и каким образом в итоге получаем элемент, а не указатель ?
  • Вопрос задан
  • 75 просмотров
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Ты работаешь скорее всего не с матрицей а с зубчатым массивом (jagged array). Или его еще называют
массив массивов. Кстати строки этого массива вовсе не обязаны быть равными. Тоесть не квадрат.
Их можно делать разного размера. И если смотреть на них сбоку - то получается картинка "зубов".

*(*(matrix + i) + j)
в данном выражении идет 2 разыменования. Первый - прыжок на зуб. И второе - прыжок к нужной ячейке
массива зуба.

В альтернативном варианте - можно создать просто массив из 100 элементов и доступ получать по формуле

matrix = new int[100];
cout << matrix[j + i * 10]


И этот подход более рациональный с точки зрения менеджера памяти. Мы выделяем 1 кусок а не 10.
Что вобщем экономит память т.к. аллокатор может резервировать больше памяти чем мы запрашиваем.
И с точки зрения когерентности по памяти это лучше т.к. мы точно знаем что соседние строки матрицы
лежат физически рядом а не разбросаны черт знает где.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы