2010-11-13 10 views
11

Я смотрел на какой-Си ++ кода, и я увидел это:int num = * (int *) number; Что это делает?

int num = *(int *)number; 

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

void *customer(void *number){ } 

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

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

ответ

11

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

+0

+1 @Charles yep, в основном num теперь будет содержать копию значения, на которое указывает число. – pstrjds

+0

Стоит добавить: при отбрасывании указателя FROM void нам нужно использовать операторы трансляции. Это причина использования (int *), которая отличает «число», который является указателем на void, указателю на int. И * еще больше почуйте этот указатель на int, чтобы вернуть int. –

10

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

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

1

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

1

Я предполагаю, что 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 не является int)

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

И это компилируется, но не будет искать клиента 69 ,

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

1

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

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

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

Вещь, которая очень помогает мне, - это когда вы видите * в своем коде - читайте ее как «на что указывает».

Если вы будете следовать этому образцу, то:

int num = *(int *)number; 

является целой переменной «Num» получает присваивается значение: то, на который указывает на Int указателя, номер. Он просто переводится.

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

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

Смежные вопросы