Проблема выяснения синтаксиса для приведения указателя
Я работал сегодня, когда натолкнулся на следующую функцию:
void button_scheduler_event_handler(void *p_event_data, uint16_t event_size)
{
button_handler(*((nrf_drv_gpiote_pin_t*)p_event_data));
}
с обработчиком кнопки, определяемым следующим образом:
void button_handler(nrf_drv_gpiote_pin_t pin)
Я не уверен, что столкнулся с этим синтаксисом:
button_handler(*((nrf_drv_gpiote_pin_t*)p_event_data));
раньше, и я немного сбит с толку. Моя первая мысль заключается в том, что синтаксис для вызова button_handler должен быть:
button_handler(((*nrf_drv_gpiote_pin_t) *p_event_data));
У меня, однако, нет хорошего объяснения, почему.
Кто-нибудь может объяснить это?
Редактировать: после ввода от пользователя UnholySheep
1 ответ
p_event_data
параметр объявлен как void *
Это означает, что это может указывать на что угодно. Однако, исходя из того, что он называет button_handler
это говорит о том, что p_event_data
на самом деле указывает на nrf_drv_gpiote_pin_t
,
Итак, сначала вам нужно разыграть void *
к nrf_drv_gpiote_pin_t *
:
(nrf_drv_gpiote_pin_t *)p_event_data
Затем вам нужно разыменовать этот указатель:
*((nrf_drv_gpiote_pin_t *)p_event_data)
И это то, что передается button_handler
,