2015-10-21 3 views
0
int compare (const void * a, const void * b) 
{ 
    return (*(int*)a - *(int*)b); 
} 

Я не понимаю выражение *(int*)a?Что означает выражение * (int *)?

+3

Это C или C++? Ответ для каждого языка будет отличаться. – emlai

+0

Я изучаю программирование на С ++ –

+0

Все ответы, которые вы получили до сих пор, являются ответами C. (Хотя применимо и на C++, так как из-за наследования C++ из C, но не считается хорошей практикой в ​​современном C++.) – emlai

ответ

8

void * указатель общий указатель, это может указывать на что-либо, но как компилятор не знает точно, что это указывает на вы должны сообщить компилятору, что именно он, указывая на. Это «рассказ» - это то, что делает актер: (int *) a сообщает компилятору, что a фактически указывает на int.

Затем код просто использует оператор разыменования (унарный *), чтобы получить значение, где a указывает и использует это в выражении нормального вычитания.

4
(int*)a 

бросает a в int*. Просто разыменование a не работает, потому что *a будет иметь тип void, что недопустимо.

Кроме того, здесь несколько небезопасно, так как a передается как const, и вызывающий абонент ожидает *a не подлежит изменению. OK, a не изменилось, но такое явное преобразование должно быть редкостью.

Дополнительные разыменование «получает» значение a указывает на. В конце концов, compare возвращает 0, если оба данных равны.

0

(int*)a конвертирует указатель void в указатель типа int. *(int*)a принимает значение, на которое указывает указатель.

+3

«принимает значение этого указателя», __no__, он _dereferences_, этот указатель, то есть принимает значение, которое указатель _ указывает на_. «Значение [the] pointer» будет адресом памяти, который он хранит. Btw вы помещаете звездочку в неправильное место, это '(int *) a' not' (int) a * ', последняя не компилируется, и если она делает это, то делает не то. – emlai

+0

Извините ... Я имел в виду это. :) И спасибо за исправление меня. – Mukit09

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