Pointer Arithmetic

Manipulating address values mathematically.

#OVERVIEWOverview
#ADDSUBAdding and subtracting from pointers
#INCDECIncrementing and decrementing pointers
#DISTANCEDistance between two pointers

OVERVIEWOverview
	It is often useful to iterate through memory, from one address to 
	another. Pointers are used to accomplish this. While the type of a 
	pointer determines the type of variable or object retrieved when the 
	pointer is dereferenced (using KeyPgOpValueOfOperator * (Value Of)), it also 
	determines the distance, in bytes, its particular type takes up in 
	memory. For example, a KeyPgShortShort takes up two (2) bytes in memory, while a 
	KeyPgSingleSingle needs four (4) bytes.

ADDSUBAdding and subtracting from pointers
	Pointers can be added to and subtracted from just like a numeric type. 
	The result of this addition or subtraction is an address, and the type 
	of pointer determines the distance from the original pointer.

	For example, the following,

	Dim p As Integer Ptr = New Integer[2]

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

	will assign the values "1" and "2" to each integer in the array pointer 
	to by p. Since p is an KeyPgIntegerInteger KeyPgPtrPointer, the expression "*(p + 1)" is 
	saying to dereference an KeyPgIntegerInteger four/eight (4/8 on 32/64bit systems) 
	bytes from p; the "1" indicates a distance of "1 * the size of an KeyPgIntegerInteger
	", or four/eight (4/8 on 32/64bit systems) bytes.

	Subtraction follows the exact same principle. Remember, a - b = a + -b.

INCDECIncrementing and decrementing pointers
	Sometimes it is more convenient to modify the pointer itself, in which 
	case the combination addition and subtraction operators will work just 
	like above. For example, the following,

	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

	iterates through an array until it finds an element with the value of "0
	". If it finds an element with the value "66" it displays a nice 
	message.

DISTANCEDistance between two pointers
	The distance between two pointers is retrieved with KeyPgOpSubtractOperator - (Subtract)
	, and is measured in values, not bytes. For example, the following,

	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)

	will output "5" regardless of what type T is. This is because there is a 
	five (5) element difference between the first element of array (32) and 
	the element pointed to by p (0).

	Specifically, if a and b are both pointers of type T, the distance 
	between them is the number of bytes between them, divided by the size, 
	in bytes, of T, or

		( cast(byte ptr, a) - cast(byte ptr, b) ) / sizeof(T)

See also
	* KeyPgOpAddOperator + (Add)
	* KeyPgOpSubtractOperator - (Subtract)
	* KeyPgOpAtOperator @ (Address Of)
	* KeyPgOpValueOfOperator * (Value Of)
	* CatPgOpPointPointer Operators

