Проблема выяснения синтаксиса для приведения указателя - PullRequest
0 голосов
/ 03 сентября 2018

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

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 Ответ

0 голосов
/ 03 сентября 2018

Параметр 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...