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

Pointers และ One-Dimensional Array ในภาษา C

ความสัมพันธ์ระหว่าง 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] = 1016

Pointer 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 ให้ฟังก์ชัน (ส่งเป็น pointer)
  • Dynamic array ด้วย malloc
  • String manipulation (char *)
  • Algorithm ที่ต้องการ random access ด้วย pointer arithmetic
คุณสมบัติArray Name (a)Pointer Variable (p)
เป็น L-valueไม่ (constant pointer)ใช่ (เปลี่ยนค่าได้)
sizeofขนาดทั้ง arrayขนาด pointer (4/8 bytes)
การกำหนดค่าa = p; // ผิดp = a; // ถูกต้อง
Pointer arithmetica++ // ผิดp++ // ถูกต้อง