0Pricing
Go Academy · レッスン

ポインターとは

アドレス演算子、デリファレンス、nilポインター

「ポインターとは」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

メモリアドレス

すべての変数はメモリアドレス上に存在します。ポインタはそのアドレスを格納します。Goのポインタには型があり、*intはintのアドレスを保持します。

アドレス演算子 &

&を使用して変数のアドレスを取得します。

package main
import "fmt"

func main() {
    x := 42
    p := &x
    fmt.Println(p)  // 0xc000... (address)
    fmt.Println(*p) // 42 (value at address)
}

間接参照 *

*を使用して、ポインタのアドレスにある値を読み書きします。

package main
import "fmt"

func main() {
    n := 10
    p := &n
    *p = 99
    fmt.Println(n) // 99
}

nilポインタ

ポインタのゼロ値はnilです。nilポインタを間接参照するとパニックが発生します。

package main
import "fmt"

func main() {
    var p *int
    fmt.Println(p)        // <nil>
    fmt.Println(p == nil) // true
    // *p = 1 — PANIC
}

ポインタ型

各ポインタ型は、指し示す対象の型に固有です。

package main
import "fmt"

func main() {
    i := 1
    s := "hello"
    pi := &i   // *int
    ps := &s   // *string
    fmt.Printf("%T %T\n", pi, ps) // *int *string
}

使用前のnilチェック

コードの外部から受け取ったポインタを間接参照する前に、必ずnilを確認してください。

package main
import "fmt"

func printInt(p *int) {
    if p == nil {
        fmt.Println("nil pointer")
        return
    }
    fmt.Println(*p)
}

func main() {
    v := 7
    printInt(&v)
    printInt(nil)
}

構造体へのポインタ

ポインタを介して構造体のフィールドにアクセスするときも同じドット記法を使用します。Goが自動的に間接参照します。

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    p := &Point{1, 2}
    p.X = 10         // same as (*p).X = 10
    fmt.Println(*p)  // {10 2}
}

ポインタの比較

2つのポインタは、同じ変数(同じアドレス)を指している場合、または両方ともnilの場合に等しくなります。

package main
import "fmt"

func main() {
    a := 1
    p1 := &a
    p2 := &a
    p3 := new(int)
    *p3 = 1
    fmt.Println(p1 == p2) // true  — same address
    fmt.Println(p1 == p3) // false — different address
}

スタックとヒープ

Goのコンパイラは、エスケープ解析によって変数をスタックとヒープのどちらに置くか決定します。ローカル変数のアドレスを取得して返すと、Goが自動的にその変数をヒープに移動するため、手動で管理する必要はありません。

ポインタを使わない場合

すべてのものにポインタが必要なわけではありません。

  • 小さな値型(int、bool、小さな構造体)は、間接参照するよりコピーする方が効率的です
  • ゴルーチン間で共有する不変データは、値として安全に扱えます
  • ポインタは主に、変更が必要な場合や大きな構造体に使用します

簡単な確認

&演算子は何を返しますか。

まとめ: ポインタ

要点:

  • &vでアドレスを取得し、*pで間接参照します
  • ゼロ値はnilです。間接参照する前に必ず確認してください
  • Goでは、構造体ポインタのフィールドアクセスで自動的に間接参照されます
  • エスケープ解析によって、スタックとヒープが自動的に管理されます

練習問題

ポインタを使用して2つの整数の値を交換する関数swap(a, b *int)を作成してください。mainから呼び出し、変更前と変更後を出力してください。

よくある質問

「ポインターとは」レッスンは無料ですか?

はい。「ポインターとは」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「ポインターとは」で何を学びますか?

アドレス演算子、デリファレンス、nilポインター ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ポインターとは」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ポインターとは
  2. ポインターと関数
  3. メソッドのポインターレシーバー
  4. new()とポインターを使う場面
← Go Academyに戻る