Как назначить адрес, указанный указателем, на другой локальный указатель
Я делаю проект обработки видео, и я был поражен назначением адреса блока для отправки в функцию dct.
Следующая строка не принимает правильный адрес присваивания в качестве правой переменной, указывающей на.
temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);
так temp
не содержит правильный адрес, указанный p_vqi->luma
переменная, где j
а также i
будет увеличиваться в 16 раз на каждом шаге максимум до 144 и 176 соответственно.
3 ответа
То, что часто привлекает людей с помощью математики указателей, это то, что она не добавляет один байт за раз, а добавляет один sizeof(thing pointed to)
в то время, так что вы собираетесь пропустить j
Люм, какой бы большой она ни была i
шорты без знака, какими бы большими они ни были на вашей архитектуре. Обычно при работе с фиксированными форматами проще и удобнее работать прямо в байтах, например:
uint8_t* temp = (uint8_t*)p_vqi->luma;
temp += j*16 + i;
Имейте в виду, что добавление числа к указателю увеличивает указатель на это количество элементов, а не на байты. Другими словами, вы сначала добавляете j * sizeof(the type of the luma entries)
к указателю, а затем i * sizeof(unsigned short)
которые для большинства реализаций составляют два байта.
Однако, если вы хотите добавить байты j + i, вы должны сделать что-то вроде этого.
temp = (unsigned short *)((intptr_t)p_vqi->luma + j + i);
Это должно дать вам указатель на беззнаковое короткое замыкание, которое является расширенным i + j байтом от оригинала. Тип intptr_t - C99, если вам нужно быть совместимым со старыми компиляторами, используйте unsigned long.
Добавление (и вычитание) указателей ведет себя иначе, чем стандартные арифметические операции. Эти операции будут учтены размером данных, которые они представляют.
Давайте рассмотрим пример, учитывая, что char - один байт, short - два байта, а int - 4 байта:
char * p1;
shot * p2;
int * p3;
p1 += 1; // p1 will be incremented by 1
p2 += 1; // p2 will be incremented by 2
p3 += 1; // p3 will be incremented by 4