Указатель
Оригинальное название: pointer
Коротко
Переменная, в которой хранится не само значение, а адрес ячейки памяти, где это значение лежит.
Что такое «Указатель»
Указатели — основа низкоуровневых языков вроде C и C++. Они позволяют передать функции большой массив, не копируя его, построить связный список или дерево, где каждый элемент знает адрес соседа, и напрямую работать с памятью устройства. Взамен программист сам отвечает за то, чтобы адрес был правильным и память не освобождалась раньше времени.
Пример на C
int x = 5;
int *p = &x; // p хранит адрес x
*p = 10; // запись по адресу: теперь x == 10
printf("%d\n", x);
Оператор & берёт адрес переменной, а * — разыменовывает указатель, то есть обращается к значению по адресу. Над указателями можно выполнять арифметику: прибавить единицу и получить адрес следующего элемента массива.
Какие ошибки связаны с указателями
- Обращение по нулевому указателю — указатель никуда не ведёт, программа аварийно завершается. Похожая проблема в высокоуровневых языках — обращение к null.
- Висячий указатель — память уже освобождена, а адрес продолжают использовать.
- Выход за границы массива — запись в чужую область памяти. Так возникает переполнение буфера, классический источник уязвимостей.
- Утечка памяти — память выделили, а указатель на неё потеряли, и освободить её уже нельзя.
Чем отличается от ссылки в PHP
В PHP, JavaScript и Python указателей в чистом виде нет: память выделяет и освобождает сам язык. Похожую роль играют ссылки. Запись $b = &$a; в PHP делает две переменные именами одного значения, но адрес получить нельзя и арифметики нет. Зато есть своя ловушка: после цикла foreach ($items as &$item) переменная $item остаётся ссылкой на последний элемент. Если дальше в коде снова использовать это имя, последний элемент массива незаметно перезапишется. Поэтому сразу после такого цикла пишут unset($item);.

