Я возился с многомерными массивами и указателями. Я смотрел программу, которая печатает содержимое и адреса простого массива. Здесь объявление массива:
int zippo[4][2] = { {2,4},
{6,8},
{1,3},
{5,7} };
В настоящее время я понимаю, что zippo - это указатель, и он может содержать адрес пары других указателей. По умолчанию zippo содержит адрес указателя zippo[0], а также может содержать адреса указателей zippo[1], zippo[2] и zippo[3].
Теперь сделайте следующее утверждение:
printf("zippo[0] = %p\n", zippo[0]);
printf(" *zippo = %p\n", *zippo);
printf(" zippo = %p\n", zippo);
На моей машине это дает следующий вывод:
zippo[0] = 0x7fff170e2230
*zippo = 0x7fff170e2230
zippo = 0x7fff170e2230
Я прекрасно понимаю, почему zippo[0] и *zippo имеют одинаковое значение. Они оба указателя, и оба они сохраняют адрес (по умолчанию) целого числа 2 или zippo[0][0]. Но что с zippo также разделяет один и тот же адрес памяти? Не следует ли zippo хранить адрес указателя zippo[0]? Whaaaat?