Указатели в C++: как перестать бояться
Указатель — это переменная, в которой хранится не значение, а адрес другой переменной. Как записка с адресом дома: вы не держите в руках сам дом, но знаете, где его найти. Два знака, которые стоит запомнить: & значит «возьми адрес», а * значит «пройди по адресу и посмотри, что там лежит».
int x = 5;
int* p = &x; // p хранит адрес x
*p = 10; // идём по адресу и меняем значение
// теперь x равен 10
Ссылка — это просто второе имя для той же переменной. Она всегда указывает на что-то одно, не бывает пустой и не переключается на другой объект. Указатель свободнее: его можно перенаправить на другую переменную или обнулить (nullptr). Но за свободу приходится платить аккуратностью.
Две самые частые ошибки: разыменовать пустой указатель (программа падает) и обратиться к памяти, которую уже освободили. В современном C++ для этого есть «умные» указатели, например std::unique_ptr, которые освобождают память сами. А понимать обычные указатели всё равно нужно: на них держится всё остальное.
Если указатели всё ещё кажутся магией, напишите мне: нарисуем схему памяти на вашем коде.