# Pointers

A pointer holds the memory address of a value. The type `^T` is a pointer to a `T` value. Its zero value is `nil`.

``````p: ^int;
``````

The `&` operator takes the address of its operand.

``````i := 1337;
p = &i;
``````

The `^` operator also dereferences the pointer to reveal its underlying value.

``````fmt.println(p^); // read `i`  through the pointer `p`
p^ = 9001;       // write `i` through the pointer `p`
``````

Note: This syntax may seem uncommon to C programmers but here's a mnemonic to help remember:

• `x^` - `x` from pointer
• `^T` - pointer to type `T`
• `&x` - address from `x`

## Pointer Arithmetic

Odin supports pointer arithmetic.

``````array := int{1, 2, 3, 4};
p := &array; // Take the pointer to the first element
i := (p + 2)^;
fmt.println(i); // Prints `3`

q := &array;
distance := q - p;
fmt.println(distance); // Prints `2`
``````

## rawptr

`rawptr` is a special pointer type that cannot be deferenced nor have pointer arithmetic. All pointers can be implicitly converted to a `rawptr`. A `rawptr` cannot be implicity converted to any other pointer type.

``````i := 123;
p: rawptr = &i;
x := p + 1; // Error: Pointer arithmetic is not supported for a `rawptr`
y := p^;    // Error: A `rawptr` cannot be deferenced
``````