Разыменование и арифметика указателей
Читайте память через указатели и перемещайтесь по массивам с помощью арифметики указателей.
«Разыменование и арифметика указателей» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Чтение через указатель
Унарный оператор * читает значение, на которое указывает указатель.
int x = 42;
int* p = &x;
std::cout << *p; // 42Запись через указатель
Также можно использовать *p в левой части присваивания, чтобы записать значение в целевой объект.
*p = 100;
std::cout << x; // 100Оператор стрелки
Для указателей на структуры или классы выражение p->member является сокращением записи (*p).member. Используйте стрелку — так принято.
struct Point { int x, y; };
Point pt{3, 4};
Point* p = &pt;
std::cout << p->x; // 3Основы арифметики указателей
К указателям можно прибавлять целые числа и вычитать их. Результат перемещается шагами, равными размеру элемента, а не байта.
int a[5] = {10, 20, 30, 40, 50};
int* p = a; // points to a[0]
p = p + 2; // now points to a[2]
std::cout << *p; // 30Обход массива
Арифметика указателей имитирует индексацию. a[i] и *(a + i) идентичны — и p[i] работает с любым указателем.
int a[] = {1, 2, 3, 4};
int* p = a;
for (int i = 0; i < 4; ++i) {
std::cout << *(p + i) << " ";
}Разность двух указателей
Вычитание двух указателей на элементы одного массива даёт расстояние в элементах — типом результата является std::ptrdiff_t.
int a[5];
int* first = a;
int* last = a + 5;
std::ptrdiff_t len = last - first; // 5Сравнение указателей
Указатели можно сравнивать на равенство с помощью == и !=, а также по порядку с помощью <, только если они указывают на элементы одного массива.
Итерация с помощью указателей
Идиоматичный перебор в стиле C использует два указателя — начала и конца.
int a[] = {1, 2, 3, 4, 5};
for (int* p = a; p != a + 5; ++p) {
std::cout << *p << " ";
}Выход за конец разрешён
Можно вычислить указатель на элемент сразу после последнего (указатель «конца»), но разыменовывать его нельзя: это неопределённое поведение.
Ошибки в арифметике указателей
Распространённые ошибки:
- Выход за границы массива
- Смешивание типов указателей (
int*+char*) - Забыть, что арифметика выполняется в единицах элементов, а не байтов
Предпочитайте итераторы или диапазоны
Современный C++ отдаёт предпочтение итераторам и библиотеке диапазонов, а не арифметике необработанных указателей. Указатели по-прежнему важны для API языка C и очень низкоуровневого кода.
Быстрая проверка
Если p — это int*, указывающий на начало 4-байтового int, на что указывает p + 1?
Повторение
*p читает или изменяет целевой объект. p->member обращается к члену структуры. Арифметика указателей перемещается шагами, равными размеру элемента. Используйте её осторожно — в современном коде итераторы и диапазоны обычно являются более безопасным выбором.
Часто задаваемые вопросы
Урок «Разыменование и арифметика указателей» бесплатный?
Да — полный текст урока «Разыменование и арифметика указателей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Разыменование и арифметика указателей»?
Читайте память через указатели и перемещайтесь по массивам с помощью арифметики указателей. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Разыменование и арифметика указателей»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обычные указатели и оператор взятия адреса
- Разыменование и арифметика указателей
- nullptr и безопасность нулевых указателей
- Когда использовать указатели, а когда ссылки