Арифметика указателей
 
Манипулирование значениями адресов математически.

Обзор
Сложение и вычитание из указателей
Увеличение и уменьшение указателей
Расстояние между двумя указателями

Обзор


Часто бывает полезно перебирая память, переходить с одного адреса на другой. Указатели используются для достижения этой цели. Тип указателя определяет тип переменной или объекта, с возможным последующим разыменовыванием с помощью оператора * (значение из). Но так же он определяет расстояние в байтах соответствующего типа. Например, Short занимает два (2) байта в памяти, а Single четыре (4) байта.

Сложение и вычитание из указателей


Указатели могут быть складываться и вычитаться точно так же, как числовой тип. Результатом этого сложения или вычитания является адрес, а тип указателя определяет расстояние от оригинального указателя.

Например, следующий код,

Dim p As Integer Ptr = New Integer[2]

*p = 1
*(p + 1) = 2

присвоит значения «1» и «2» для каждого числа Integer, в массиве по указателю p. Так как p — это Integer Pointer, выражение «*(p + 1)» говорит что разыменовывается тип Integer четыре (4) байта из p; «1» указывает на расстояние «1 * размер Integer», или четыре (4) байта.

Вычитание по тому же принципу. Помните, a - b = a + -b.

Увеличение и уменьшение указателей


Иногда удобнее изменить сам указатель, и в этом случае сочетание операторов сложения и вычитания будет работать так же, как выше. Например, в следующем примере,

Dim array(5) As Short = { 32, 43, 66, 348, 112, 0 }
Dim p As Short Ptr = @array(0)

While (*p <> 0)
    If (*p = 66) Then Print "found 66"
    p += 1
Wend

происходит итерация по массиву, пока не будет найден элемент со значением "0". Если найден элемент со значением "66" , то отображается сообщение.

Расстояние между двумя указателями


Расстояние между двумя указателями извлекается с помощью оператора - (вычитание), и измеряется в значениях, а не байтах. Например, следующий пример,

Type T As Single

Dim array(5) As T = { 32, 43, 66, 348, 112, 0 }
Dim p As T Ptr = @array(0)

While (*p <> 0)
    p += 1
Wend
Print p - @array(0)

выведет "5" независимо от типа Т. Это потому, что существует разница пять (5) элементов от начального (32) до конечного элемента (0) массива.

В частности, если А и В оба указатели типа Т, расстояние между ними число байт между ними, деленное на размер в байтах Т или:

Abs(cast(byte ptr, a) - cast(byte ptr, b)) / SizeOf(T)


См. также