ในภาษา C Array และ Pointer มีความสัมพันธ์ใกล้ชิดกัน ชื่ออาร์เรย์ (Array Name) จะถูกแปลงเป็น Pointer ไปยังสมาชิกแรกในบริบทส่วนใหญ่
หน่วยความจำของ Array
int a[5] = {10, 20, 30, 40, 50};
จัดเก็บติดต่อกันในหน่วยความจำ (Contiguous Memory):
| Index | Value | Address (ตัวอย่าง) |
|---|---|---|
| a[0] | 10 | 1000 (Base Address) |
| a[1] | 20 | 1004 |
| a[2] | 30 | 1008 |
| a[3] | 40 | 1012 |
| a[4] | 50 | 1016 |
Scale Factor ของ int = 4 bytes
ความสัมพันธ์ Array กับ Pointer
int *p = a; // p ชี้ a[0] (เทียบเท่า &a[0])
int *p = &a[0]; // ชี้ตัวแรกชัดเจน
การเข้าถึงสมาชิก
| Array Notation | Pointer Notation | Address |
|---|---|---|
| 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]