Ты работаешь скорее всего не с матрицей а с зубчатым массивом (jagged array). Или его еще называют
массив массивов. Кстати строки этого массива вовсе не обязаны быть равными. Тоесть не квадрат.
Их можно делать разного размера. И если смотреть на них сбоку - то получается картинка "зубов".
*(*(matrix + i) + j)
в данном выражении идет 2 разыменования. Первый - прыжок на зуб. И второе - прыжок к нужной ячейке
массива зуба.
В альтернативном варианте - можно создать просто массив из 100 элементов и доступ получать по формуле
matrix = new int[100];
cout << matrix[j + i * 10]
И этот подход более рациональный с точки зрения менеджера памяти. Мы выделяем 1 кусок а не 10.
Что вобщем экономит память т.к. аллокатор может резервировать больше памяти чем мы запрашиваем.
И с точки зрения когерентности по памяти это лучше т.к. мы точно знаем что соседние строки матрицы
лежат физически рядом а не разбросаны черт знает где.