Ссылки и динамическая память
Дай переменной второе имя, храни её адрес и грамотно одалживай память
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) и позже указывать на другую переменную.