0Pricing
Go Academy · บทเรียน

พอยน์เตอร์คืออะไร

ตัวดำเนินการหาที่อยู่ การอ้างอิงค่าที่พอยน์เตอร์ชี้ และพอยน์เตอร์ nil

พอยน์เตอร์คืออะไร เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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}
}

การเปรียบเทียบพอยน์เตอร์

พอยน์เตอร์สองตัวเท่ากันเมื่อชี้ไปยังตัวแปรเดียวกัน (มีที่อยู่เดียวกัน) หรือเมื่อเป็น 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 แยกอ้างอิงโดยอัตโนมัติเมื่อเข้าถึงฟิลด์ของสตรักต์ผ่านพอยน์เตอร์
  • การวิเคราะห์การย้ายออกจากขอบเขตจะจัดการเรื่องสแตกกับฮีปโดยอัตโนมัติ

โจทย์ฝึกปฏิบัติ

เขียนฟังก์ชัน swap(a, b *int) ที่สลับค่าของจำนวนเต็มสองจำนวนโดยใช้พอยน์เตอร์ เรียกใช้ฟังก์ชันจาก main แล้วพิมพ์ค่าก่อนและหลังการสลับ

คำถามที่พบบ่อย

บทเรียน “พอยน์เตอร์คืออะไร” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พอยน์เตอร์คืออะไร” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พอยน์เตอร์คืออะไร”

ตัวดำเนินการหาที่อยู่ การอ้างอิงค่าที่พอยน์เตอร์ชี้ และพอยน์เตอร์ nil คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “พอยน์เตอร์คืออะไร” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พอยน์เตอร์คืออะไร
  2. พอยน์เตอร์และฟังก์ชัน
  3. ตัวรับพอยน์เตอร์ในเมธอด
  4. new() และกรณีที่ควรใช้พอยน์เตอร์
← กลับไปที่ Go Academy