Перейти к содержанию

Ссылки и динамическая память

Программирование C++ Сложность 1/5

Начало урока

Ссылки и динамическая память

Дай переменной второе имя, храни её адрес и грамотно одалживай память

Главная идея: Ссылка — это второе имя для уже существующей переменной. Указатель — это переменная, которая хранит адрес другой переменной. Стек — быстрая, автоматическая память; куча — дополнительная память, которую ты запрашиваешь через new и обязан вернуть через delete.
К концу урока ты сможешь:
  • отличать ссылку от указателя,
  • объяснять, где находятся стек и куча,
  • выделять и освобождать память в куче через new и delete без утечек.

1. Ссылка — это второе имя

Ссылка — это ещё одно имя (псевдоним) для уже существующей переменной. Ты создаёшь её с помощью символа & в объявлении. После этого ссылка и оригинал — это одна и та же ячейка памяти: меняешь одно — меняется и другое.

Аналогия: если тебя зовут Александр, а дома тебя называют «Саша», оба имени указывают на одного человека. Накормишь Сашу обедом — и Александр уже не голоден, ведь это один и тот же человек.

#include <iostream>
using namespace std;

int main() {
    int score = 10;
    int& alias = score;       // alias is a SECOND name for score

    alias = 25;                // changing alias changes score
    cout << score << endl;   // 25
    return 0;
}

Ожидаемый вывод: 25. Так как alias — это второе имя для score, запись в одно меняет и второе. Ссылке обязательно нужно дать то, на что она ссылается, при создании, и потом её нельзя перенаправить на другую переменную.

2. Указатель хранит адрес

Указатель — это переменная, значением которой является адрес в памяти другой переменной. Его объявляют через *, а адрес получают оператором взятия адреса &. Чтобы добраться до значения по этому адресу, указатель разыменовывают, снова через *.

Аналогия: указатель — это как стикер с адресом дома друга. Стикер — не дом, но по адресу можно прийти в гости и даже переставить мебель внутри.

#include <iostream>
using namespace std;

int main() {
    int n = 42;
    int* p = &n;      // p holds the ADDRESS of n

    cout << n  << endl;   // 42
    cout << *p << endl;   // 42  (value at that address)

    *p = 100;              // change n THROUGH the pointer
    cout << n  << endl;   // 100
    return 0;
}

Ожидаемый вывод: 42, затем 42, затем 100. Здесь &n означает «адрес n», а *p означает «значение по адресу в p». В отличие от ссылки, указатель может быть пустым (nullptr) и позже указывать на другую переменную.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя