Арифметика указателя довольно проста для понимания. Если у вас есть указатель на первый элемент массива, то p + 1 указывает на второй элемент и так далее, независимо от размера каждого элемента. Таким образом, даже если бы у вас был массив целых или произвольная структура MyData, он сохранял бы значение.
MyData data[100];
MyData *p1 = data;; // same as &data[0]
MyData *p2 = p1 + 1; // same as &data[1]
MyData *p3 = p2 + 1; // same as &data[2]
MyData *p4 = p2 - 1; // same as &data[0] again
Если ваш массив - беззнаковый символ, то вы просто добавляете в массив столько смещений, сколько хотите, например,
unsigned char data[16384];
unsigned char *offset = data + 512; // same as &data[512]
*offset = 5; // same as data[512] = 5;
В качестве альтернативы, если обозначение сбивает с толку, вы всегда можете обратиться к нему, как показано в комментариях выше, например, &data[512]