Skip to content

Latest commit

 

History

History
169 lines (119 loc) · 5.24 KB

Pointers.md

File metadata and controls

169 lines (119 loc) · 5.24 KB

Pointers in Go

Pointers are a powerful feature in Go that allow you to work with memory addresses directly. This guide will explain pointers in detail, including how to declare, use, and dereference them, with code examples.

What is a Pointer?

A pointer is a variable that holds the memory address of another variable. Pointers are useful for various tasks, such as passing large structures to functions without copying them, or creating linked data structures like lists and trees.

Declaring Pointers

To declare a pointer, use the * operator before the type. This indicates that the variable is a pointer to a value of that type.

var p *int // p is a pointer to an int

Obtaining the Address of a Variable

To get the address of a variable, use the & operator. This operator returns the memory address of the variable.

var x int = 10
var p *int = &x // p now holds the address of x

Dereferencing a Pointer

Dereferencing a pointer means accessing the value stored at the memory address the pointer holds. Use the * operator before the pointer variable to dereference it.

var x int = 10
var p *int = &x
fmt.Println(*p) // *p gives the value of x, which is 10

Example: Working with Pointers

Here is a complete example that demonstrates declaring pointers, obtaining addresses, and dereferencing pointers.

package main

import "fmt"

func main() {
    var x int = 10
    var p *int = &x // p is a pointer to x

    fmt.Println("Value of x:", x)   // 10
    fmt.Println("Address of x:", &x) // address of x
    fmt.Println("Value of p:", p)   // address of x
    fmt.Println("Value at p:", *p)  // 10 (dereferencing p)
}

Pointers and Functions

Pointers are often used to pass variables to functions by reference, allowing the function to modify the original variable.

Example: Passing Pointers to Functions

package main

import "fmt"

func increment(p *int) {
    *p = *p + 1 // dereference p and increment the value
}

func main() {
    var x int = 10
    fmt.Println("Before increment:", x) // 10
    increment(&x)
    fmt.Println("After increment:", x)  // 11
}

In this example, the increment function takes a pointer to an int and increments the value at that address. The main function passes the address of x to increment, allowing it to modify x directly.

Pointers to Structs

Pointers can also be used with structs to avoid copying large structures.

Example: Pointers to Structs

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func birthday(p *Person) {
    p.Age++ // increment the Age field
}

func main() {
    person := Person{Name: "Alice", Age: 30}
    fmt.Println("Before birthday:", person) // {Alice 30}
    birthday(&person)
    fmt.Println("After birthday:", person)  // {Alice 31}
}

In this example, the birthday function takes a pointer to a Person struct and increments the Age field. The main function passes the address of person to birthday, allowing it to modify the person struct directly.

Summary

  • * with a type: Declares a pointer type.
  • * with a pointer variable: Dereferences the pointer to get the value it points to.
  • & with a variable: Gets the address of the variable.

Pointers are a fundamental concept in Go that provide powerful capabilities for working with memory and optimizing performance. By understanding and using pointers effectively, you can write more efficient and flexible Go programs.

More Notes

In Go (and C), * and & are used to work with pointers. Here is a breakdown of what they are and when to use them:

  • (Pointer Type) Definition: * is used to declare a pointer type. A pointer holds the memory address of a value. Usage: When you want to create a variable that holds the address of another variable.
var x int = 10
var p *int = &x // p is a pointer to an int, holding the address of x

& (Address Operator)

  • Definition: & is used to get the address of a variable.
  • Usage: When you want to obtain the memory address of a variable to store it in a pointer.
var x int = 10
var p *int = &x // &x gives the address of x

Dereferencing a Pointer

  • Definition: Dereferencing a pointer means accessing the value stored at the memory address the pointer holds.
  • Usage: Use * before a pointer variable to get the value it points to.
var x int = 10
var p *int = &x
fmt.Println(*p) // *p gives the value of x, which is 10
  • Use * to declare a pointer type.
  • Use & to get the address of a variable.
  • Use * to dereference a pointer and access the value it points to.

Pointers are a powerful feature in Go that allow you to work with memory addresses directly. By understanding how to declare, use, and dereference pointers, you can leverage their capabilities to optimize performance and create more efficient programs.

package main

import "fmt"

func main() {
    var x int = 10
    var p *int = &x // p is a pointer to x

    fmt.Println("Value of x:", x)   // 10
    fmt.Println("Address of x:", &x) // address of x
    fmt.Println("Value of p:", p)   // address of x
    fmt.Println("Value at p:", *p)  // 10 (dereferencing p)
}