Компилятор знает по типу cast. Учитывая void *x
:
x+1
добавляет один байт в x
, указатель переходит к байту x+1
(int*)x+1
добавляет sizeof(int)
байты, указатель переходит к байт x + sizeof(int)
(float*)x+1
addres sizeof(float)
байт и т. д. Хотя первый элемент не переносится и выступает против Galateo of C / C ++, тем не менее, C-language-correct, то есть он скомпилирует что-то на большинстве компиляторов, возможно, требуя соответствующего флага (например, -Wpointer-arith)