Что это за манипуляция с указателем * этим - PullRequest
0 голосов
/ 12 октября 2018

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

Этот код:

class TE32ImageUids
{
public:
    TE32ImageUids(uint32_t aUid1, uint32_t aUid2, uint32_t aUid3);
    uint32_t Check();
private:
    uint32_t iUids[KMaxCheckedUid] = {0};
    uint32_t iCheck=0;
};

TE32ImageUids::TE32ImageUids(uint32_t aUid1, uint32_t aUid2, uint32_t aUid3)
{
   iUids[0]=aUid1;
   iUids[1]=aUid2;
   iUids[2]=aUid3;
}

uint32_t TE32ImageUids::Check()
{
    return ((checkSum(((uint8_t*)this)+1)<<16)|checkSum(this));
}

Я хочу переписать как функцию:

uint32_t GetUidChecksum(uint32_t aUid1, uint32_t aUid2, uint32_t aUid3)
{
    return checksum;
}

но подумайте, не понимаете, что произошло в return ((checkSum(((uint8_t*)this)+1)<<16)|checkSum(this));

(uint8_t*)this, трактует *this как массив символов.((uint8_t*)this)+1) выглядит как второй элемент в этом массиве.Но что удерживает * это?Данные участники в первую очередь?Может быть, указатели на функции?

1 Ответ

0 голосов
/ 12 октября 2018

Немного разбито: return ((checkSum(((uint8_t*)this)+1)<<16)|checkSum(this));

(uint8_t*)this по-прежнему является указателем на местоположение текущего объекта, но данные теперь интерпретируются как 8-разрядное целое число без знака.((uint8_t*)this)+1 в основном добавляет единицу к this (интерпретируется как 8-разрядное целое число без знака), давая указатель на второй байт объекта.Затем контрольная сумма этого значения смещается влево на 16 позиций и обрабатывается побитовым ИЛИ с контрольной суммой указателя на первый байт this.Если checkSum возвращает 16-битное число, то в основном вы получаете контрольную сумму адреса второго байта объекта, за которой следует контрольная сумма адреса первого байта объекта.Может быть, было бы яснее увидеть это так:

return (checkSum(&((uint8_t*) this)[1]) << 16) | checkSum(&((uint8_t*) this)[0]);

...