Хорошо, для этого требуется немного теории указателей.
Допустим, у нас есть
int** a = malloc(sizeof(int*) * 10);
int** p;
for(p = a; p < a + 10; p++) {
*p = malloc(sizeof(int) * 15);
}
Это создает массив размером 10 на 15, реализованный с использованием указателей. Обратите внимание, что каждый элемент, содержащийся в блоке памяти, на который указывает a
, имеет тип int*
(потому что мы неправильно используем блок 15 int
с).
Вот неполная диаграмма:
a
|
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 8 - 9 - 10
| |
| 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15
|
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15
Таким образом, основной указатель - это указатель на блок, который содержит несколько указателей. Таким образом, вы в конечном итоге разыменовываете для получения внутреннего указателя, добавляете для получения другого указателя и снова разыменовываете.