как назначить адрес, на который указывает указатель, на другой локальный указатель - PullRequest
2 голосов
/ 11 мая 2011

Я занимаюсь проектом обработки видео, и меня поразило назначение адреса блока для отправки в функцию dct.

Следующая строка не принимает правильный адрес назначения в качестве правой переменной, указывающейк.

temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);

, поэтому temp не содержит правильный адрес, указанный переменной p_vqi->luma, где j и i будут увеличиваться 16 раз на каждом шаге максимум до 144и 176 соответственно.

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Имейте в виду, что добавление числа к указателю увеличивает указатель на это количество элементов, а не байтов. Другими словами, вы сначала добавляете 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.

2 голосов
/ 11 мая 2011

То, что часто привлекает людей с математикой указателя, это то, что он не добавляет один байт за раз, он добавляет один sizeof(thing pointed to) за раз, так что вы собираетесь пропустить j люм, как бы великото есть i шорты без знака, какими бы большими они не были в вашей архитектуре.Обычно при работе с фиксированными форматами проще и удобнее работать прямо в байтах, например:

uint8_t* temp = (uint8_t*)p_vqi->luma;
temp += j*16 + i;
1 голос
/ 11 мая 2011

Добавление (и вычитание) указателей ведет себя иначе, чем стандартные арифметические операции. Эти операции будут учитываться по размеру данных, которые они представляют.

Давайте рассмотрим пример, учитывая, что 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
...