Частично проблема заключается в том, что источник, по-видимому, использует термины «масштабированный» и «преобразованный» взаимозаменяемо.
Масштабирование, на которое они ссылаются в одном смысле, - это масштабирование, выполняемое только в контекстеарифметика указателей.Например:
int buffer[5];
int *pi = buffer;
pi += 2;
Адрес, на который изначально указывает pi
, представляет собой один байт или char
.Но когда к нему добавляется 2, адрес увеличивается на 8 или 16 байтов, в зависимости от того, является ли система 32-битной или 64-битной системой.Это связано с тем, что размер int
составляет 4 или 8 байтов.Таким образом, используемое действительное значение называется масштабированным.
Другой смысл использования термина «масштабированный» в источнике - это когда он относится, например, к значению size_t
, являющемуся «масштабируется по int ", а затем снова масштабируется.
Это сбивает с толку, потому что на самом деле это означает, что значение size_t
преобразуется в int
(для допустимой арифметики указателей), а затем масштабируется вконтекст этой арифметики.
В тех случаях, когда это становится проблемой для арифметики указателей, разумеется, независимо от того, теряет ли преобразование информацию.
Главное, что следует помнить об арифметике указателей, - это всегдаубедитесь, что значение, которое, по вашему мнению, вы используете, на самом деле является значением, которое вы фактически используете.