Объекты · Классы и память

Указатели

Адреса в памяти: что это и почему в современном коде их мало

~30 мин 7 шагов

После урока ты сможешь

  • Читать код с * и &
  • Использовать указатель как необязательную ссылку-наблюдателя
  • Узнавать опасные места в старом коде: new/delete, висячие указатели

Шаг 1 из 7

Адрес в памяти

Каждая переменная лежит где-то в оперативной памяти, и у этого места есть адрес — номер ячейки. Оператор & перед переменной возвращает её адрес, а указатель — это переменная, которая хранит адрес:

main.cpp
#include <print>
​
int main() {
    int score = 42;
    int* p = &score;        // p хранит адрес score
​
    std::println("значение: {}", score);
    std::println("адрес: {}", static_cast<void*>(p));
    std::println("по адресу лежит: {}", *p);   // разыменование
​
    *p = 100;               // меняем то, на что указывает p
    std::println("score теперь {}", score);
}
  • int* — тип «указатель на int».
  • &x — взять адрес x.
  • *p — разыменовать: обратиться к тому, на что указывает p.

Да, & и * здесь значат не то, что в объявлениях ссылок и в умножении. Контекст решает всё, и к этому быстро привыкаешь.

Проверь себя

Что выведет программа?

main.cpp
#include <print>
​
int main() {
    int a = 1;
    int b = 2;
    int* p = &a;
    *p = 10;
    p = &b;
    *p += 5;
    std::println("{} {}", a, b);
}
Enter — проверить, Shift+Enter — новая строка