Напоминаем, что таблица const
и указатели:
int * p -- Pointer to a mutable (read/write) location. Pointer and target data may be modified.
int const * p -- Pointer to read only location. The data at the location constant, read-only.
int * const p -- Constant pointer to read/write location. Pointer can't be changed, but data at location may be changed.
int const * const p -- Constant pointer to constant data. Neither pointer nor data may be changed.
В объявлении:
int sum(const int *begin, const int *end);
Указатели являются изменяемыми указателями на постоянные данные. Указатели могут быть изменены, но они указывают на постоянные (только для чтения) данные.
Редактировать 1: увеличение указателя
Давайте назначим указатель, p
, значение 0x12.
Целые числа будут иметь длину 4 байта:
+---+
p -> | 1 | 0x12
+---+
| 2 | 0x13
+---+
| 3 | 0x14
+---+
| 4 | 0x15
+---+
| 0 | 0x16
+---+
| 6 | 0x17
+---+
| 1 | 0x18
+---+
| 9 | 0x19
+---+
Целое число в *p
== 1234 (предоставляется макет с прямым порядком байтов).
При увеличении p
будет получен адрес: 0x12 + 1 * sizeof(int)
или
0x12 + 1 * (4) == 0x16
.
+---+
p -> | 1 | 0x12
+---+
| 2 | 0x13
+---+
| 3 | 0x14
+---+
| 4 | 0x15
+---+
p + 1 -> | 0 | 0x16
+---+
| 6 | 0x17
+---+
| 1 | 0x18
+---+
| 9 | 0x19
+---+
Редактировать 2: Выравнивание
С этой точки зрения существует проблема выравнивания .
Предположим, что процессор 32-битный. Размер внутреннего регистра (слова) составляет 32 бита (4 октета). Процессор определен для извлечения 32-битной памяти.
Давайте сохраним целые числа по адресам 4, 8, 12 и 16. Двоичное представление этих адресов:
0000 0100 -- 4
0000 1000 -- 8
0000 1100 -- 12
0001 0000 -- 16
Как видите, самые правые 2 бита всегда равны нулю. Разработчику процессора не нужно реализовывать 2 самые правые адресные строки (тем самым экономя деньги и пространство на рынке недвижимости). В этом процессоре выборки по адресу, равномерно делимому на 4, наиболее эффективны (1 выборка). Они выровнены по 4-байтовой границе .