ความสัมพันธ์ระหว่าง Pointer และ Array
ใน C ชื่อ array (array name) จะ decay ให้เป็น pointer ชี้ไปที่ element แรก (base address) ทำให้ pointer และ array ใช้งานแทนกันได้ในหลายกรณี
การจัดสรรหน่วยความจำ Array
คอมไพเลอร์จัดสรรหน่วยความจำ ต่อเนื่อง (contiguous) สำหรับทุก element
int a[5] = {10, 20, 30, 40, 50};
// ที่อยู่สมมติ base = 1000, int = 4 bytes
// a[0] = 1000, a[1] = 1004, a[2] = 1008, a[3] = 1012, a[4] = 1016Pointer Arithmetic และ Scale Factor
เมื่อ pointer เพิ่มขึ้น 1 จะขยับไปข้างหน้า sizeof(datatype) ไบต์ เรียกว่า scale factor
int *p = a; // p = &a[0] = 1000 p + 1 = 1004 // &a[1] p + 2 = 1008 // &a[2] p + 3 = 1012 // &a[3] p + 4 = 1016 // &a[4]
การเข้าถึง Element
ทั้ง 4 รูปแบบนี้เทียบเท่ากัน:
a[i] *(a + i) *(p + i) p[i]
ตัวอย่างโปรแกรม: ใช้ Pointer เข้าถึง Array
#include <stdio.h>
int main() {
int a[5];
int *p, i;
printf("ป้อน 5 ตัวเลข: ");
for (i = 0; i < 5; i++)
scanf("%d", &a[i]);
p = &a[0]; // หรือ p = a;
printf("ค่าใน array: ");
for (i = 0; i < 5; i++)
printf("%d ", *(p + i));
printf("\\n");
return 0;
}ผลลัพธ์
ป้อน 5 ตัวเลข: 10 20 30 40 50 ค่าใน array: 10 20 30 40 50
ความแตกต่างสำคัญ: Array Name vs Pointer Variable
| คุณสมบัติ | Array Name (a) | Pointer Variable (p) |
|---|---|---|
| เป็น L-value | ไม่ (constant pointer) | ใช่ (เปลี่ยนค่าได้) |
| sizeof | ขนาดทั้ง array | ขนาด pointer (4/8 bytes) |
| การกำหนดค่า | a = p; // ผิด | p = a; // ถูกต้อง |
| Pointer arithmetic | a++ // ผิด | p++ // ถูกต้อง |