реклама на сайте
подробности

 
 
> указатель на указатель, помочь разобраться
Метценгерштейн
сообщение Jul 27 2018, 10:48
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Встретил в коде следующую конструкцию:

Код
ble_advdata_tk_value_t* oob_key;
err_code = nfc_tk_value_get(&oob_key);


где:

Код
typedef struct
{
  uint8_t tk[BLE_GAP_SEC_KEY_LEN];      /**< Array containing TK value in little-endian format. */
} ble_advdata_tk_value_t;


Код
ret_code_t nfc_tk_value_get(ble_advdata_tk_value_t ** pp_tk_value)
{
    if (m_tag_match)
    {
        *pp_tk_value = &m_device_tk;
        return NRF_SUCCESS;
    }
    else
    {
        return NRF_ERROR_NOT_FOUND;
    }
}


Есть вопрос. Как все проговорить что тут происходит?
Есть тип структуры ble_advdata_tk_value_t. Создали переменную- указатель на этот тип: oob_key.
Дальше? Передаем не просто адрес (сам указатель oob_key), а именно адрес этого указателя? А в ф-ии уже принимаем указатель на указатель?
Разыменовывали на один уровень вверх и по тому значению присвоили адрес уже массива.

А проще никак?
err_code = nfc_tk_value_get(oob_key);

и приняли:
Код
ret_code_t nfc_tk_value_get(ble_advdata_tk_value_t * pp_tk_value)
{
    if (m_tag_match)
    {
        pp_tk_value = &m_device_tk;
        return NRF_SUCCESS;
    }
    else
    {
        return NRF_ERROR_NOT_FOUND;
    }
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Метценгерштейн
сообщение Jul 29 2018, 05:19
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Спасибо. Упустил из вида момент, что
Код
ble_advdata_tk_value_t *oob_key;

это просто объявление переменной, но она непроинициализирована. А здесь
Код
err_code = nfc_tk_value_get(&oob_key);

мы просто передаем адрес (0х1000) этой переменной. Как обычно.

а вот здесь зачем указатель на указатель?
Код
ret_code_t nfc_tk_value_get(ble_advdata_tk_value_t ** pp_tk_value)

Разве не достаточно было так:
Код
ret_code_t nfc_tk_value_get(ble_advdata_tk_value_t * pp_tk_value)
{
    pp_tk_value = &m_device_tk;
}


Давайте аналогию приведем.

int a;
int *p;
p = &a;
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jul 29 2018, 07:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Метценгерштейн @ Jul 29 2018, 08:19) *
Давайте аналогию приведем.

int a;
int *p;
p = &a;

Давйте.
Код
int a;
int *p;
p = &a;
Это "снаружи" функции.
В самой функции параметр (например, p1) является копией p. Изменяя p1, вы не можете изменить p.
Код
   /* При вызове функции происходит следующее */
   int *p1 = p; /* в параметр копируется указатель, передаваемый в функцию */
  
   int b; /* локальная переменная функции */
   p1 = &b; /* изменяется p1, т.е копия p, но сам p не изменяется */
Go to the top of the page
 
+Quote Post
GeorgK
сообщение Aug 31 2018, 17:37
Сообщение #4





Группа: Участник
Сообщений: 9
Регистрация: 23-08-18
Пользователь №: 107 025



Возможно (вроде этого не было), стоит ещё упомянуть о передаче аргумента в функцию по адресу?

Код
void func(int &k) { k = 5};

....

int k = 0;
func(k);
//Здесь k равно 5.


Иногда это удобнее, если только не забывать, что изменение аргумента скажется на вызывающей функции.

Впрочем, для передачи сложных типов часто используется запись вроде func(const int &arg),
позволяющая не тащить при вызове в стек весь тип, а обойтись его адресом. А компилятор проследит, чтобы по ходу функции аргумент не был изменён.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   указатель на указатель   Jul 27 2018, 10:48
- - Kabdim   Всё что со знаками вопроса - верно. Проще никак. С...   Jul 27 2018, 11:05
- - x893   есть передать сам указатель вы его изменить не смо...   Jul 27 2018, 11:44
- - Метценгерштейн   Хорошо, а в моем приведенном примере- в чем ошибка...   Jul 27 2018, 11:51
|- - x893   Цитата(Метценгерштейн @ Jul 27 2018, 14:5...   Jul 27 2018, 12:09
- - Метценгерштейн   Не нашел в инете такой книжки. Не совсем понимаю,...   Jul 27 2018, 12:25
- - _pv   на что будет указывать oob_key после выполнения фу...   Jul 27 2018, 12:39
- - Метценгерштейн   Разыменование происходит в оригинальном примере: *...   Jul 27 2018, 12:54
|- - _pv   Цитата(Метценгерштейн @ Jul 27 2018, 19:5...   Jul 27 2018, 13:49
||- - Метценгерштейн   Цитата(_pv @ Jul 27 2018, 16:49) в каком ...   Jul 27 2018, 14:32
|- - Kabdim   Цитата(Метценгерштейн @ Jul 27 2018, 15:5...   Jul 27 2018, 14:48
|- - DASM   Цитата(Kabdim @ Jul 27 2018, 17:48) Но де...   Jul 27 2018, 15:22
- - Метценгерштейн   Так я же не против почитать что-то) Читал много, н...   Jul 27 2018, 14:50
- - Kabdim   Упрощенно: Переменная снаружи имеет какое-то значе...   Jul 27 2018, 15:02
|- - Herz   Цитата(Kabdim @ Jul 27 2018, 18:02) В сте...   Jul 27 2018, 17:32
|- - Arlleex   Цитата(Herz @ Jul 27 2018, 20:32) Простит...   Jul 27 2018, 18:21
- - Метценгерштейн   Кодret_code_t nfc_tk_value_get(ble_advdata_tk_...   Jul 27 2018, 15:24
- - Arlleex   Попробую внести ясности-понятности. Код// допустим...   Jul 27 2018, 15:41
- - Kabdim   2Метценгерштейн: Видимо я утерял нить рассуждений....   Jul 27 2018, 15:42
- - Метценгерштейн   Arlleex, спасибо за подробное изложение. Прошлись ...   Jul 27 2018, 19:42
|- - Arlleex   Цитата(Метценгерштейн @ Jul 27 2018, 22:4...   Jul 28 2018, 11:15
- - x893   Для АРМ параметры передаются через регистры (пока ...   Jul 27 2018, 19:46
- - Метценгерштейн   Спасибо. Упустил из вида момент, что Кодble_advda...   Jul 28 2018, 16:59
- - DASM   Давайте давайте учтите плохому. "Within funct...   Sep 1 2018, 04:17
- - Professor Chaos   Цитата(Метценгерштейн @ Jul 29 2018, 08:1...   Sep 1 2018, 13:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 21:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016