Указатели могут быть хитрыми, вот аналогия: указатель похож на строку, прикрепленную к захороненному сокровищу, вы можете следить за ним и находить его.Это «строка» и явно НЕ «сокровище».
Строка здесь - это адрес памяти того, что вы храните.И данные это сокровище.Данные могут быть любыми, но указатель всегда является адресом.
Таким образом, вы можете выполнять математику с помощью указателей.Вот краткое изложение того, что на самом деле происходит в коде:
int start = 0;
Эта строка создает локальную переменную, которая будет содержать целое число.Это автоматически выделяет память в текущем кадре стека (не очень важно, что именно это означает, но данные должны где-то жить).
При первом запуске цикла int* i = &start
выполняется, и теперь высделал указатель i
, который указывает на адрес start
(синтаксис &foo
даст адрес foo
вместо значения foo
).Адрес start
находится в вашем текущем фрейме стека, к которому ваша программа может получить доступ.Синтаксис *i
называется «разыменованием», что представляет собой причудливый способ сказать «следование за сокровищем» за строкой (т. Е. Перейти по адресу и получить имеющееся там значение или установить его там).
Кроме того, условие i <= (&start + 360)
фактически проверяет, что представленный i
адрес находится на расстоянии менее 360 адресов от адреса запуска.Я не уверен, что вы этого хотели или нет, но для ясности объяснил.
После одной итерации i++
выполняется.Помните, i
это указатель, что означает, что это адрес.Так что этот код на самом деле увеличивает адрес, а не данные.Поскольку i
является конкретно указателем int
, добавление 1 к нему сместит адрес на 4 байта (размер int
).
После перемещения i
, попыткаразыменовать это означает переход к другому адресу, который больше не является адресом, который содержит start
.
Теперь, по общему признанию, это - то, где это становится намного более опасным (по крайней мере, в моем уме), потому что ошибки указателя являютсякошмарный сон.Обычно проблемы с указателями возникают из-за попытки разыменования нулевого указателя (здесь это не так, поскольку у вашего указателя определенно есть значение) или из-за попытки доступа к памяти, к которой у вас нет доступа.В этом случае я считаю, что это последнее.Поскольку вы увеличили указатель i
, вы переместили адрес и теперь пытаетесь установить значение в местоположении (*i = 20
), что, вероятно, вызывает ошибку или странное поведение.
Надеемся, чтопомогает уточнить указатели и объяснить источник ваших ошибок.