Ответ 1
Часть (int *) присваивает номер переменной указателю на int, а затем * перед этим разыгрывает его в int.
Я смотрел на некоторый код С++, и я увидел это:
int num = *(int *)number;
Я никогда раньше этого не видел? он был в функции, обозначенной как таковая:
void *customer(void *number){ }
Что это делает? Есть ли другой способ показать это?
Спасибо, это не домашняя работа. Кстати, я был просто смущен тем, что это делает?
Часть (int *) присваивает номер переменной указателю на int, а затем * перед этим разыгрывает его в int.
Функция принимает void*
, но каким-то образом она знает (возможно, это требуется в какой-то документации где-нибудь), что указатель, который он дал, фактически указывает на int
.
Итак, (int*)number
- это "исходный указатель, преобразованный в int*
, чтобы я мог прочитать int
из него", а *(int*)number
- значение int, на которое оно указывает.
Функция принимает указатель на void (таким образом, void *). Для того чтобы разыменовать его с переменной определенного типа (например, int) - это то, что делает первый "*" - вам нужно направить его на указатель на фактический тип - в этом случае на int pointer via (int *) cast
Я предполагаю, что 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
- это будет особый случай.
Правильные ответы уже есть, но могу ли я сказать вам трюк, который мне вообще помог, когда мне пришлось много использовать C?
Как вы произносите "*" в своей голове - и есть две части.
Общая часть состоит в том, что она является частью типа - и все, вероятно, говорят "указатель", когда они читают это, что здорово. Итак, (int *) является указателем на int, или я даже переверну его в голове, чтобы читать "указатель на int", который, кажется, немного помогает.
То, что мне очень помогает, - это когда вы видите * в своем коде - читайте его как "на что указывает".
Если вы выполните этот шаблон, то:
int num = *(int *)number;
- целочисленная переменная "num" получает значение: на что указывает указатель int, число. Он просто переводится.
Иногда вам приходится возиться с фразировкой немного, но так как я попал в эту привычку, у меня никогда не было большой проблемы с чтением кода указателя.
Я считаю, что я также читал и как "Адрес" на C, но я думаю, что он был перегружен на С++, если я правильно помню.