Я возился с многомерными массивами и указателями. Я смотрел программу, которая печатает содержимое и адреса простого массива. Здесь объявление массива:
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?