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

Pointer to Array (ตัวชี้อาร์เรย์) ใน C

Pointer to Array คือ Pointer ที่ชี้ไปยังอาร์เรย์ทั้งลูก (ทั้งบล็อกหน่วยความจำ) ไม่ใช่ชี้ตัวแปรก่อนหน้า ต่างจาก Pointer to First Element (int *ptr = arr;) ที่ชี้แค่ตัวแรก

ไวยากรณ์

datatype (*variable_name)[size];
  • datatype - ชนิดข้อมูลขององค์ประกอบ (int, char, float, ฯลฯ)
  • variable_name - ชื่อ pointer variable
  • size - ขนาดของอาร์เรย์ (จำนวนองค์ประกอบ)

หมายเหตุ: วงเล็บ () รอบ *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 Arrayint (*ptr)[3]ชี้อาร์เรย์ทั้งลูกขนาด 3+1 = ข้าม 3 ints (12 bytes)
Array of Pointersint *ptr[3]อาร์เรย์ของ 3 pointers+1 = ข้าม 1 pointer (4/8 bytes)
Pointer to First Elementint *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 แรก