Проблема выяснения синтаксиса для приведения указателя

Я работал сегодня, когда натолкнулся на следующую функцию:

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,

Другие вопросы по тегам