Это связано с тем, как арифметика указателя работает в C. Когда вы добавляете целое число x
к указателю p
, оно не всегда добавляет x
байтов.Он добавляет x
раз sizeof([type that p points to])
.
float* row = (float*)((char*)devPtr + r * pitch);
. При приведении devPtr
к char*
применяется смещение (r * pitch*
) с шагом в 1 байт.(потому что char
это один байт).Если бы приведение не было там, смещение, примененное к devPtr, было бы r * pitch
умножено на 4 байт, так как float
- это четыре байта.
Например, если мы имеем:
float* devPtr = 1000;
int r = 4;
Теперь давайте не будем использовать приведение:
float* result1 = (devPtr + r);
// result1 = devPtr + (r * sizeof(float)) = 1016;
Теперь, если мы включим приведение:
float* result2 = (float*)((char*)devPtr + r);
// result2 = devPtr + (r * sizeof(char)) = 1004;