Манипулирование значениями адресов математически.
Обзор
Сложение и вычитание из указателей
Увеличение и уменьшение указателей
Расстояние между двумя указателями
Обзор
Часто бывает полезно перебирая память, переходить с одного адреса на другой.
Указатели используются для достижения этой цели. Тип указателя определяет
тип переменной или объекта, с возможным последующим разыменовыванием с
помощью
оператора * (значение из).
Но так же он определяет расстояние в байтах соответствующего типа. Например,
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)
См. также