Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

Pointers (ตัวชี้) ใน C/C++: พื้นฐานและการใช้งาน

Pointer (ตัวชี้) คือตัวแปรที่เก็บ ที่อยู่หน่วยความจำ (Memory Address) ของตัวแปรอื่น เมื่อจัดสรรหน่วยความจำให้ตัวแปร Pointer จะชี้ไปที่ที่อยู่นั้น ใช้ตัวดำเนินการ * (Unary operator) ในการประกาศและ Dereference

ไวยากรณ์

datatype *variable_name;
  • datatype - ชนิดข้อมูลที่ Pointer ชี้ไป (int, char, float, struct, ฯลฯ)
  • variable_name - ชื่อของ Pointer Variable

ตัวอย่างพื้นฐาน

#include <stdio.h>

int main() {
    int a = 8;
    int *ptr;      // ประกาศ pointer ชี้ int
    ptr = &a;      // กำหนดให้ ptr ชี้ที่อยู่ของ a
    
    printf("Value of variable: %d\n", a);           // 8
    printf("Address of variable: %p\n", (void*)ptr); // ที่อยู่ของ a
    printf("Value via pointer: %d\n", *ptr);        // 8 (dereference)
    
    return 0;
}

ผลลัพธ์

Value of variable: 8
Address of variable: 0x7ffeefbff5ac
Value via pointer: 8

คำอธิบายคำสั่งสำคัญ

Operatorชื่อฟังก์ชันตัวอย่าง
&Address-of lấyที่อยู่ของตัวแปรptr = &a;
*Dereference / Indirectionเข้าถึงค่าที่ Address ชี้val = *ptr;
*Declarationประกาศ pointer (ใน Declaration)int *ptr;

Pointer Arithmetic

Pointer สามารถทำคณิตศาสตร์ได้ โดยเลื่อนตามขนาดของชนิดข้อมูลที่ชี้

int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;

ptr++;      // ชี้ arr[1] (address + sizeof(int))
ptr += 2;   // ชี้ arr[3] (address + 2*sizeof(int))
ptr--;      // ชี้ arr[2]

ประเภท Pointers สำคัญ

1. Null Pointer

int *ptr = NULL;      // C style
int *ptr = nullptr;   // C++11 style (แนะนำ)

2. Void Pointer (Generic Pointer)

void *ptr = &a;  // ชี้ได้ทุกชนิด ต้อง cast ก่อนใช้

3. Const Pointers

const int *ptr1;      // Pointer to const int (ค่าที่ชี้ไม่ให้เปลี่ยน)
int *const ptr2 = &a; // Const pointer to int (Pointer ไม่ให้ชี้ที่อื่น)
const int *const ptr3 = &a; // ทั้งคู่ const

4. Function Pointers

int (*funcPtr)(int, int);  // ชี้ฟังก์ชันรับ int 2 ตัว คืน int
funcPtr = &add;            // กำหนดฟังก์ชัน

การใช้งานทั่วไป (Common Use Cases)

  • Dynamic Memory Allocation: malloc, free, new, delete
  • Pass by Reference: ส่ง Pointer เข้าฟังก์ชันเพื่อแก้ไขค่าตัวแปรต้นทาง
  • Arrays & Strings: Array name decay เป็น Pointer to first element
  • Data Structures: Linked Lists, Trees, Graphs (Nodes ชี้กัน)
  • Function Pointers: Callbacks, Plugin systems, State machines

ข้อผิดพลาดที่พบบ่อย (Common Pitfalls)

  • Dangling Pointer: ชี้หน่วยความจำที่ถูก Free แล้ว
  • Memory Leak: malloc โดยไม่ free
  • Uninitialized Pointer: ใช้ Pointer ก่อนกำหนดที่อยู่
  • Buffer Overflow: เขียนเกินขอบเขตที่จัดสรร
  • Double Free: free เดียวกัน 2 ครั้ง

Best Practices

  • Initialize Pointers เสมอ (NULL หรือ nullptr)
  • ใช้ const ให้มากที่สุดเพื่อป้องกันการแก้ไขโดยไม่ตั้งใจ
  • ใน C++ ใช้ Smart Pointers (unique_ptr, shared_ptr) แทน Raw Pointers
  • ตรวจสอบ NULL ก่อน Dereference
  • ตั้งชื่อให้ชัดเจน: ptr_, p suffix หรือ _ptr suffix