Главная chevron_right Структура chevron_right Операторы доступа к указателям chevron_right * (dereference operator)

* (dereference operator)

Оператор * (разыменование) обращается к значению по адресу указателя: *p читает его, а *p = 5; записывает новое.

Полная статья

Описание

Когда вы работаете с указателями, вам нужно уметь не только хранить адрес переменной, но и обращаться к значению по этому адресу. Именно для этого служит оператор разыменования *. Если p — это указатель (то есть переменная, содержащая адрес в памяти), то *p даёт доступ к самому значению, которое лежит по этому адресу.

Другими словами: p — это «где», а *p — это «что там лежит».

Оператор разыменования работает в обе стороны: через *p можно как читать значение, так и записывать новое — достаточно использовать *p в левой части присваивания.

Пример кода

    int *p;       // объявляем указатель на тип данных int
    int i = 5;
    int result = 0;
    p = &i;       // теперь 'p' содержит адрес переменной 'i'
    result = *p;  // 'result' получает значение по адресу, на который указывает 'p'
                  // то есть получает значение 'i', равное 5

Где применяется

  • Передача переменной по ссылке в функцию — когда нужно, чтобы функция изменила значение переменной, объявленной в вызывающем коде, а не её копию.
  • Работа с массивами и буферами — при обходе массива через арифметику указателей *p читает текущий элемент, а p++ переходит к следующему.
  • Работа со структурами данных — связные списки, очереди и другие динамические структуры строятся на указателях, и разыменование там встречается повсеместно.
  • Взаимодействие с библиотеками — некоторые Arduino-библиотеки принимают или возвращают указатели, и чтобы добраться до нужного значения, приходится использовать *p.

Практические замечания

  • Перед разыменованием убедитесь, что указатель инициализирован и указывает на допустимую область памяти. Разыменование неинициализированного или нулевого указателя (nullptr / NULL) вызывает неопределённое поведение и может привести к зависанию или сбросу платы.
  • Не путайте * в объявлении переменной (int *p;) и * как оператор разыменования (*p = 5;). В объявлении звёздочка говорит о типе переменной, в выражении — обращается к значению по адресу.
  • Если вы передаёте указатель в функцию и разыменовываете его внутри, изменения затронут оригинальную переменную — это и есть «передача по ссылке» в стиле C.
  • При работе с массивами помните, что имя массива уже является указателем на его первый элемент, поэтому *arr эквивалентно arr[0].
  • Для отладки удобно выводить и адрес, и значение через Serial Monitor: Serial.print((int)p) покажет адрес, Serial.print(*p) — значение по этому адресу.

Примечания и предупреждения

Указатели — одна из самых непростых тем для тех, кто только начинает изучать C и C++. Большинство скетчей для Arduino можно написать, вообще не прибегая к указателям. Тем не менее в ряде задач — обработка строк, работа с буферами, оптимизация кода под ограниченную память — умение пользоваться указателями и оператором * заметно упрощает решение и делает код эффективнее.