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

Pointers และ Arrays ในภาษา C: ความสัมพันธ์และการใช้งาน

ในภาษา C Array และ Pointer มีความสัมพันธ์ใกล้ชิดกัน ชื่ออาร์เรย์ (Array Name) จะถูกแปลงเป็น Pointer ไปยังสมาชิกแรกในบริบทส่วนใหญ่

หน่วยความจำของ Array

int a[5] = {10, 20, 30, 40, 50};

จัดเก็บติดต่อกันในหน่วยความจำ (Contiguous Memory):

IndexValueAddress (ตัวอย่าง)
a[0]101000 (Base Address)
a[1]201004
a[2]301008
a[3]401012
a[4]501016

Scale Factor ของ int = 4 bytes

ความสัมพันธ์ Array กับ Pointer

int *p = a;        // p ชี้ a[0] (เทียบเท่า &a[0])
int *p = &a[0];    // ชี้ตัวแรกชัดเจน

การเข้าถึงสมาชิก

Array NotationPointer NotationAddress
a[0]*p หรือ *(p+0)p
a[1]*(p+1)p+1
a[2]*(p+2)p+2
a[i]*(p+i)p+i

สูตรที่อยู่: Address of a[i] = Base Address + (i × Scale Factor)

Pointer Arithmetic

  • p + 1 ชี้ไปสมาชิกถัดไป (บวก sizeof(datatype) ไบต์)
  • p++ เลื่อนไปสมาชิกถัดไป
  • p + i ชี้ไป a[i]
  • p2 - p1 คืนจำนวนสมาชิกระหว่าง 2 Pointer (ต้องชี้ Array เดียวกัน)

ตัวอย่างโปรแกรม: เข้าถึง Array ผ่าน Pointer

#include <stdio.h>

int main() {
    int a[5];
    int *p;
    int i;
    
    printf("Enter 5 elements: ");
    for(i = 0; i < 5; i++)
        scanf("%d", &a[i]);
    
    p = a;  // p = &a[0]
    
    printf("Elements via pointer: ");
    for(i = 0; i < 5; i++)
        printf("%d ", *(p + i));  // หรือ p[i]
    
    printf("\n");
    return 0;
}

ผลลัพธ์

Enter 5 elements: 10 20 30 40 50
Elements via pointer: 10 20 30 40 50

ความแตกต่างสำคัญ: Array Name vs Pointer Variable

ลักษณะArray Name (a)Pointer Variable (p)
Lvalue (อยู่ด้านซ้าย =)ไม่ได้ (Constant Pointer)ได้ (Modifiable)
sizeofขนาดทั้งอาร์เรย์ (20 bytes)ขนาด Pointer (4/8 bytes)
การกำหนดค่าไม่ได้ a = p ❌ได้ p = a ✅
Incrementไม่ได้ a++ ❌ได้ p++ ✅

Multidimensional Arrays และ Pointers

int matrix[3][4];

// matrix เป็น pointer to array of 4 ints
// Type: int (*)[4]

int (*p)[4] = matrix;  // p ชี้แถวแรก
p[1][2] = 99;          // เข้าถึง matrix[1][2]