我正在做一個視頻處理項目,並且在分配塊地址以發送給dct函數時遇到了麻煩。如何將指針指向的地址分配給另一個本地指針
下面一行沒有將正確的賦值地址作爲右手變量指向。
temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);
所以temp
不包含由p_vqi->luma
變量,其中j
和i
將在最長爲144和176的每個步驟分別遞增16次指出正確的地址。
我正在做一個視頻處理項目,並且在分配塊地址以發送給dct函數時遇到了麻煩。如何將指針指向的地址分配給另一個本地指針
下面一行沒有將正確的賦值地址作爲右手變量指向。
temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);
所以temp
不包含由p_vqi->luma
變量,其中j
和i
將在最長爲144和176的每個步驟分別遞增16次指出正確的地址。
經常讓人們指點數學的東西是,它一次不會添加一個字節,它一次增加一個sizeof(thing pointed to)
,所以你會跳過j
lumas,不管怎麼說,然後是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是一個字節,短是兩個字節和一個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
如何'luma'聲明?它背後的數據組織是什麼? – sharptooth 2011-05-11 06:59:33