* (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 можно написать, вообще не прибегая к указателям. Тем не менее в ряде задач — обработка строк, работа с буферами, оптимизация кода под ограниченную память — умение пользоваться указателями и оператором * заметно упрощает решение и делает код эффективнее.