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_,psuffix หรือ_ptrsuffix