Что происходит в строке кода const ProbabilityTable a = *(ProbabilityTable*)elem1?

191
05 июня 2018, 21:50

Что происходит в строке кода

const ProbabilityTable a = *(ProbabilityTable*)elem1

в следующей функции:

struct ProbabilityTable { 
        unsigned char symb;
        double prob;    };
static int ProbabTableComp(const void *elem1, const void *elem2){ // метод сравнения для qsort  
   const ProbabilityTable a = *(ProbabilityTable*)elem1;
   const ProbabilityTable b = *(ProbabilityTable*)elem2;
   if (a.prob < b.prob)         
      return 1;     
   else if (a.prob > b.prob)        
      return -1;    
   else         
      return 0; }
Answer 1
const ProbabilityTable a = *(ProbabilityTable*)elem1;

В elem1 находится адрес некоторого места в памяти, которое мы хотим, рассматривая его как переменную типа ProbabilityTable, инициализировать ею константу a.

Поскольку у нас есть только адрес, выполняя приведение (ProbabilityTable*)elem1, мы получаем указатель на ProbabilityTable. Чтобы получить само значение, необходимо этот указатель разыменовать с помощью оператора *, что и делается в рассматриваемой строке. Ну, а дальше это значение копируется в a...

Кстати, я бы не копировал эти значения, а сравнение выполнял, обращаясь непосредственно к местам в памяти. Если структуры большие, копирование может повлиять на производительность...

READ ALSO
стек на основе односвязного списка C++

стек на основе односвязного списка C++

Не могу сообразить, как проверить на пустоту стек:

204
Ошибка сборки при Platform Toolset v141_xp

Ошибка сборки при Platform Toolset v141_xp

Пустой консольный проект студии 2017, с настройками по умолчанию, кроме Platform Toolset: v141_xp, с таким кодом:

566
Как записать время через : .Время C++

Как записать время через : .Время C++

Не могу нигде найти, как сделать,чтобы можно было вводить время через ":"К примеру, 09:45

223