Предположим, вы разбирали массив int
. Вашему компаратору будет передана пара int *
, замаскированная под void *
; добавляется один уровень косвенности.
Если вы сортируете массив из struct mystruct *
, ваш компаратор передается struct mystruct **
замаскирован под void *
; добавляется один уровень косвенности.
В чем смысл struct mystruct * const *
? Без const*
он не может правильно отобразить. Зачем?
Что означает «без const *
», он не правильно выбрасывает? » Без const
он работает нормально. Без второго *
он не работает, потому что функция передается struct mystruct **
(дайте или возьмите некоторую константу), и если вы опустите вторую звезду, вы злоупотребляете системой типов.
Рассмотрим:
struct mystruct
{
int i;
};
int myptrstructcmp(const void *p1, const void *p2);
int myptrstructcmp(const void *p1, const void *p2)
{
struct mystruct *sp1 = *(struct mystruct **)p1;
struct mystruct *sp2 = *(struct mystruct **)p2;
if (sp1->i < sp2->i)
return -1;
else if (sp1->i > sp2->i)
return +1;
else
return 0;
}
Это нормально компилируется. Он также отлично компилируется при добавлении const
между **
. Лично я бы не включил const
в литье. Что бы я сделал это сопзЬ-квалифицируют sp1
и sp2
указатели:
struct mystruct const *sp1 = *(struct mystruct **)p1;
struct mystruct const *sp2 = *(struct mystruct **)p2;
или:
const struct mystruct *sp1 = *(struct mystruct **)p1;
const struct mystruct *sp2 = *(struct mystruct **)p2;
Это обещает не изменять объекты, которые они указывают на в функции, которая на самом деле важно правильная производительность qsort()
.
Когда 'qsort()' вызывает вашу функцию сравнения, он не может передать * значение * двух элементов массива, которые он хочет сравнить, потому что они не имеют постоянного размера. Таким образом, он вместо этого передает * указатели * в начало элементов массива, которые он хочет сравнить. – EOF
В C (во втором) этот актер не нужен! Правильно - второе! Если вы используете первое, вы говорите, что хотите назначить содержимое структуры структуре! * Вне скобки означает, что вы хотите, чтобы содержимое указывалось p, литой означает, что содержимое имеет тип struct mystruct !. В примере, который вы цитируете, не выбраны, а *. –
В чем смысл 'struct mystruct * const *'? Без 'const *' он не может корректно отображать. Зачем? – abcxyz