การประกาศ Double Pointer
คล้ายการประกาศ Pointer ธรรมดา แต่มี * เพิ่มอีก 1 ตัวหน้าชื่อตัวแปร
ไวยากรณ์
int **ptr;
ตัวอย่างโปรแกรมสมบูรณ์
#include <stdio.h>
int main() {
int element = 24;
// Single pointer
int *ptr2 = &element;
// Double pointer
int **ptr1 = &ptr2;
// แสดงค่าผ่านทั้ง 2 ระดับ
printf("element value = %d\n", element);
printf("via single pointer (*ptr2) = %d\n", *ptr2);
printf("via double pointer (**ptr1) = %d\n", **ptr1);
return 0;
}
ผลลัพธ์:
element value = 24
via single pointer (*ptr2) = 24
via double pointer (**ptr1) = 24
ภาพแสดงความสัมพันธ์
ptr1 (int **) ──────→ ptr2 (int *) ──────→ element (int) │ │ │ │ │ └── 24 │ └── Address of element └── Address of ptr2
การใช้งานจริง (Use Cases)
- เปลี่ยนค่า Pointer ในฟังก์ชัน - ส่ง
int **เข้าไป เพื่อให้ฟังก์ชันเปลี่ยน address ที่ pointer ชี้ได้ - Dynamic 2D Array -
int **matrix = malloc(rows * sizeof(int *)); - Linked List / Tree - การจัดการ Node pointers
- Command Line Arguments -
int main(int argc, char **argv)
ตัวอย่าง: เปลี่ยน Pointer ในฟังก์ชัน
void allocate(int **ptr, int size) {
*ptr = malloc(size * sizeof(int)); // เปลี่ยนค่า pointer ต้นทาง
}
int main() {
int *p = NULL;
allocate(&p, 10); // ส่ง address ของ p
// ตอนนี้ p ชี้ไปที่หน่วยความจำที่จองไว้ 10 int
free(p);
return 0;
}