Указатель

Оригинальное название: 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);.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение