Int num = * (int *) number; Что это делает?

Я смотрел на некоторый код С++, и я увидел это:

int num = *(int *)number;

Я никогда раньше этого не видел? он был в функции, обозначенной как таковая:

void *customer(void *number){ }

Что это делает? Есть ли другой способ показать это?

Спасибо, это не домашняя работа. Кстати, я был просто смущен тем, что это делает?

Ответ 1

Часть (int *) присваивает номер переменной указателю на int, а затем * перед этим разыгрывает его в int.

Ответ 2

Функция принимает void*, но каким-то образом она знает (возможно, это требуется в какой-то документации где-нибудь), что указатель, который он дал, фактически указывает на int.

Итак, (int*)number - это "исходный указатель, преобразованный в int*, чтобы я мог прочитать int из него", а *(int*)number - значение int, на которое оно указывает.

Ответ 3

Функция принимает указатель на void (таким образом, void *). Для того чтобы разыменовать его с переменной определенного типа (например, int) - это то, что делает первый "*" - вам нужно направить его на указатель на фактический тип - в этом случае на int pointer via (int *) cast

Ответ 4

Я предполагаю, что customer используется следующим образом:

int lookup = 123;
customer_key *key = customer(&lookup);
// do something with key here

В этом случае код в клиенте приписывает void * к int *, а затем разыменовывает его (получает его значение). Сначала он должен выглядеть, потому что void * в основном означает "указатель на что-то", что позволяет вам передавать любой желаемый тип. Без typecast компилятор не знает, хотите ли вы читать char (обычно 1 байт), short (обычно 2 байта) или int (обычно 4 байта). Приведенный тип устраняет двусмысленность.

Примечание, использующее void * для аргумента, вероятно, не лучшее, поскольку вы могли бы сделать:

double lookup = 69.0f;
customer_key *key = customer(&lookup);

И это скомпилируется, но не будет искать клиента 69 (a double не является int!).

Использование void * может быть преднамеренным, код может быть в состоянии определить (надеюсь, безопасно) между указателями и аргументом типа: (void *)3 - это будет особый случай.

Ответ 5

Правильные ответы уже есть, но могу ли я сказать вам трюк, который мне вообще помог, когда мне пришлось много использовать C?

Как вы произносите "*" в своей голове - и есть две части.

Общая часть состоит в том, что она является частью типа - и все, вероятно, говорят "указатель", когда они читают это, что здорово. Итак, (int *) является указателем на int, или я даже переверну его в голове, чтобы читать "указатель на int", который, кажется, немного помогает.

То, что мне очень помогает, - это когда вы видите * в своем коде - читайте его как "на что указывает".

Если вы выполните этот шаблон, то:

int num = *(int *)number;

- целочисленная переменная "num" получает значение: на что указывает указатель int, число. Он просто переводится.

Иногда вам приходится возиться с фразировкой немного, но так как я попал в эту привычку, у меня никогда не было большой проблемы с чтением кода указателя.

Я считаю, что я также читал и как "Адрес" на C, но я думаю, что он был перегружен на С++, если я правильно помню.