Относительно вопроса в заголовке:
Если указатель хранит адрес переменной и сам является переменной, разве он не создает бесконечные указатели и заполняет всю системную память?
Нет.Я добавил некоторый код для вывода адресов и содержимого каждого из i
, j
, k
и l
, и вот результат:
Item Address 00 01 02 03
---- ------- -- -- -- --
i 0x7ffee31d3a48 37 00 00 00 7...
j 0x7ffee31d3a44 58 00 00 00 X...
k 0x7ffee31d3a38 48 3a 1d e3 H:..
0x7ffee31d3a3c fe 7f 00 00 ....
l 0x7ffee31d3a30 44 3a 1d e3 D:..
0x7ffee31d3a34 fe 7f 00 00 ....
Надеемся, что вывод сам-объяснительно - каждая строка показывает название элемента, его адрес и его содержимое (как в шестнадцатеричном, так и в виде последовательности байтов).
Я нахожусь в системе с прямым порядком байтов, поэтому многобайтовые объекты должны читаться снизу вверх, справа налево.
В любом случае, i
живет по адресу 0x7ffee31d3a48
и сохраняет значение 55
(0x37
).k
живет по адресу 0x7ffee31d3a38
и сохраняет значение 0x7ffee31d3a48
, которое является адресом i
.
Нет бесконечной регрессии адресов.k
- это просто еще одна переменная - единственная разница между ней и i
заключается в том, что она хранит значения другого типа.
Что касается другого вашего вопроса:
Почему раскомментирование предыдущей строки изменяет вывод с 0 на 88?
Выражение k++
меняет то, чтоk
указывает на - он больше не указывает на i
.Вот состояние программы после этого выражения:
Item Address 00 01 02 03
---- ------- -- -- -- --
i 0x7ffee31d3a48 37 00 00 00 7...
j 0x7ffee31d3a44 58 00 00 00 X...
k 0x7ffee31d3a38 4c 3a 1d e3 L:..
0x7ffee31d3a3c fe 7f 00 00 ....
l 0x7ffee31d3a30 44 3a 1d e3 D:..
0x7ffee31d3a34 fe 7f 00 00 ....
Вместо сохранения адреса i
(0x7ffee31d3a48
), k
теперь сохраняет адрес 0x7ffeee31d3a4c
, который ...не адрес какого-либо объекта в вашей программе.На этом этапе попытка разыменования k
вызывает неопределенное поведение - ваш код может дать сбой, или вы можете получить неожиданный вывод, или каким-то чудом вы можете получить ожидаемый результат.Удаление оператора printf
изменяет расположение вашей программы в памяти, что влияет на то, на что k
указывает после выражения k++
.