2011-05-11 290 views
2

我正在做一個視頻處理項目,並且在分配塊地址以發送給dct函數時遇到了麻煩。如何將指針指向的地址分配給另一個本地指針

下面一行沒有將正確的賦值地址作爲右手變量指向。

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

所以temp不包含由p_vqi->luma變量,其中ji將在最長爲144和176的每個步驟分別遞增16次指出正確的地址。

+3

如何'luma'聲明?它背後的數據組織是什麼? – sharptooth 2011-05-11 06:59:33

回答

2

經常讓人們指點數學的東西是,它一次不會添加一個字節,它一次增加一個sizeof(thing pointed to),所以你會跳過j lumas,不管怎麼說,然後是i未簽名的短褲,然而這在你的架構上很大。

uint8_t* temp = (uint8_t*)p_vqi->luma; 
temp += j*16 + i; 
2

要知道,加入了不少的指針由許多元素,而不是字節爲單位的指針:通常情況下,它具有固定格式時以字節爲直的工作,如更容易,更便於攜帶。換句話說,您首先將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。

+0

感謝哈拉德先生自己做到了這一點,但它給予了警告警告C4047:'=':'unsigned short **'與'unsigned short *'的間接水平不同' – Arun 2011-05-11 12:43:43

+0

我自己嘗試了不同的命令,但它仍然不知道它正確或錯誤,因爲我仍然在代碼中。 – Arun 2011-05-11 12:45:24

+0

臨時申報是怎樣的? – harald 2011-05-11 12:48:32

1

指針的加法(&減法)具有不同於標準算術運算的行爲。這些操作將因其代表的數據大小而被分解。

讓舉一個例子,考慮到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