Pointer to Array คือ Pointer ที่ชี้ไปยังอาร์เรย์ทั้งลูก (ทั้งบล็อกหน่วยความจำ) ไม่ใช่ชี้ตัวแปรก่อนหน้า ต่างจาก Pointer to First Element (int *ptr = arr;) ที่ชี้แค่ตัวแรก
ไวยากรณ์
datatype (*variable_name)[size];
datatype- ชนิดข้อมูลขององค์ประกอบ (int, char, float, ฯลฯ)variable_name- ชื่อ pointer variablesize- ขนาดของอาร์เรย์ (จำนวนองค์ประกอบ)
หมายเหตุ: วงเล็บ () รอบ *variable_name สำคัญมาก - ไม่มีวงเล็บจะกลายเป็น datatype *variable_name[size] ซึ่งคือ Array of Pointers
ตัวอย่าง
#include <stdio.h>
int main() {
int arr[3] = {10, 20, 30};
// Pointer to Array of 3 ints
int (*ptr)[3] = &arr;
printf("Address of array: %p\n", (void*)&arr);
printf("Pointer value: %p\n", (void*)ptr);
printf("First element: %d\n", (*ptr)[0]); // 10
printf("Second element: %d\n", (*ptr)[1]); // 20
// Pointer arithmetic: ptr + 1 ชี้ไปอาร์เรย์ถัดไป (ข้าม 3 ints)
printf("ptr + 1 address: %p (skips %zu bytes)\n", (void*)(ptr + 1), sizeof(arr));
return 0;
}
ผลลัพธ์ตัวอย่าง
Address of array: 0x7ffeefbff5a0
Pointer value: 0x7ffeefbff5a0
First element: 10
Second element: 20
ptr + 1 address: 0x7ffeefbff5ac (skips 12 bytes)
ความแตกต่าง: Pointer to Array vs Array of Pointers
| ประเภท | Declaration | ความหมาย | ขนาด Pointer Arithmetic |
|---|---|---|---|
| Pointer to Array | int (*ptr)[3] | ชี้อาร์เรย์ทั้งลูกขนาด 3 | +1 = ข้าม 3 ints (12 bytes) |
| Array of Pointers | int *ptr[3] | อาร์เรย์ของ 3 pointers | +1 = ข้าม 1 pointer (4/8 bytes) |
| Pointer to First Element | int *ptr = arr | ชี้ตัวแรกของอาร์เรย์ | +1 = ข้าม 1 int (4 bytes) |
การใช้งานจริง: ส่งอาร์เรย์ 2D เข้าฟังก์ชัน
void print2D(int (*arr)[3], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[2][3] = {{1,2,3}, {4,5,6}};
print2D(matrix, 2); // matrix decay เป็น int (*)[3]
return 0;
}
สรุป
- ใช้
int (*ptr)[N]เมื่อต้องการ Pointer ชี้อาร์เรย์ขนาด N ทั้งลูก - มีประโยชน์สำหรับการส่งอาร์เรย์หลายมิติเข้าฟังก์ชัน
- Pointer Arithmetic ทำงานตามขนาดอาร์เรย์ทั้งลูก
- ต่างจาก
int *ptrที่ชี้แค่ Element แรก