Когда вы увеличиваете T*
, он перемещается sizeof(T)
байт. † Это потому, что не имеет смысла перемещать любое другое значение: если я указываю на int
например, это 4 байта, что даст мне увеличение на 4? Частичное int
, смешанное с некоторыми другими данными: бессмысленные.
Учтите это в памяти:
[↓ ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
Что имеет больше смысла, когда я увеличиваю этот указатель? Это:
[↓ ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
Или это:
[↓ ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
Последний на самом деле не указывает на какой-либо int
. (Технически, тогда использование этого указателя UB .)
Если вы действительно хотите переместить один байт, увеличьте значение char*
: размер char
всегда равен единице:
int i = 0;
int* p = &i;
char* c = (char*)p;
char x = c[1]; // one byte into an int
† Следствием этого является то, что вы не можете увеличить void*
, потому что void
является неполным типом.