Как плюсовые действуют на этот массив структур? - PullRequest
0 голосов
/ 22 декабря 2018

Я перечитывал исходный код pngquant ( здесь )

Я запутался, когда увидел, что плюс-равно приписывает новое значение массиву структур (base += r в приведенном ниже фрагменте кода):

static void hist_item_sort_range(hist_item base[], unsigned int len, unsigned int sort_start)
{
    for(;;) {
        const unsigned int l = qsort_partition(base, len), r = l+1;

        if (l > 0 && sort_start < l) {
            len = l;
        }
        else if (r < len && sort_start > r) {
            base += r; len -= r; sort_start -= r;
        }
        else break;
    }
}

Определение hist_item имеет вид:

typedef struct {
    f_pixel acolor;
    float adjusted_weight,   // perceptual weight changed to tweak how mediancut selects colors
          perceptual_weight; // number of pixels weighted by importance of different areas of the picture

    float color_weight;      // these two change every time histogram subset is sorted
    union {
        unsigned int sort_value;
        unsigned char likely_colormap_index;
    } tmp;
} hist_item;

Я заранее извиняюсь, потому что я уверен, что те, кто взнать, что это, должно быть, очень глупый вопрос, но как работает плюс-равно на base, который выглядит как массив структур и некоторое целое число r?Мне кажется, что эта операция должна быть неопределенной для комбинации этих двух типов.

Мне не приходилось писать C почти десять лет, и я, по общему признанию, довольно ржавый;однако, поиск в течение приблизительно тридцати минут только нашел ответы на неправильные вопросы, и любая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 23 декабря 2018

Как объяснено в Что такое распадающийся массив?

static void hist_item_sort_range(hist_item base[], unsigned int len, unsigned int sort_start)

становится

static void hist_item_sort_range(hist_item* base, unsigned int len, unsigned int sort_start)

Где base - указатель на первый элемент массива,Поэтому base += r; выполняет простую арифметику указателя, то есть: изменяет указатель так, чтобы он указывал на смещение r элементов от начала массива.
Из-за += исходный указатель изменяется, поэтому любой доступ происходитсо смещением от теперь указанного элемента.

Чтобы использовать пример из комментария:
После base += 1; доступ к «первому» элементу через &base[0]; дает указатель на тот же элемент, что и &base[1]; до приращения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...