Ответ :
q-p будет 250, если вы находитесь на машине, где int
равно 4 байта.
Расчет составляет:
q - p = 1000
1000/4 (размер целого) = 250
Идея, стоящая за этим :
Идея арифметики указателей заключается в том, что если у вас есть int
указатель на 1000 и int
указатель на 2000, и вы спрашиваете разницу, вы не спрашиваете, что такое 2000- 1000. То, что вы спрашиваете, , сколько int
я могу разместить между ними.
Это очень удобно для всех видов операций, например:
int *i = 100;
i++; // This is **not** 101, it is 104, cause you actually want the next place an int could fit in memory.
Это особенно удобно при работе с массивами. Массив целых чисел (определенный int arr[10]
) в основном обрабатывается как указатель. Когда вы пишете arr[5]
, компилятор преобразует его в *(arr + 5)
, то есть добавляет 5 к указателю int
с именем arr
и получает значение по этому адресу.
Причина, по которой это работает, заключается в том, что arr + 5
делает не означает «добавьте 5 к значению arr», это означает «добавьте все, что необходимо к значению arr для продвижения вперед 5 * 1036» * s ", или, точнее," добавьте 5 * sizeof(int)
к значению arr "