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 := [4]int{1, 2, 3, 4};
p := &array[0]; // Take the pointer to the first element
i := (p + 2)^;
fmt.println(i); // Prints `3`

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


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

results matching ""

    No results matching ""