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

การส่ง Array ทั้งอันเป็น Argument ให้ Function ในภาษา C

การส่ง Array ทั้งอัน** ให้ฟังก์ชัน ใน C จะส่งผ่าน Pointer ไปยัง Element แรก** (Pass by Reference แบบ Implicit) ไม่ได้ส่ง Copy ของ Array ทั้งชุด

หลักการ

  • ใน Function Call: ส่งแค่ชื่อ Array func(arr) (Decay to Pointer)
  • ใน Function Parameter: รับเป็น int arr[] หรือ int *arr หรือ int arr[SIZE] (ทั้ง 3 เหมือนกัน)
  • ต้องส่งขนาด Array แยกต่างหาก (เพราะ sizeof(arr) ในฟังก์ชันจะได้ขนาด Pointer)

ตัวอย่างที่ 1: Basic Array Passing

#include <stdio.h>

void display(int arr[5]) {  // หรือ int arr[] หรือ int *arr
    printf("Array elements: ");
    for(int i = 0; i < 5; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

int main() {
    int a[5], i;
    
    printf("Enter 5 elements: ");
    for(i = 0; i < 5; i++)
        scanf("%d", &a[i]);
    
    display(a);  // ส่ง Array ทั้งอัน
    
    return 0;
}

ผลลัพธ์

Enter 5 elements: 10 20 30 40 50
Array elements: 10 20 30 40 50

ตัวอย่างที่ 2: ส่ง Array พร้อม Size (แนะนำ)

#include <stdio.h>

void printArray(int arr[], int n) {  // รับ Pointer + Size
    printf("Elements: ");
    for(int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

void doubleArray(int arr[], int n) {  // แก้ไขค่าใน Array ได้
    for(int i = 0; i < n; i++)
        arr[i] *= 2;
}

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    
    printArray(a, 5);
    doubleArray(a, 5);  // แก้ไขค่าใน Array จริง
    printArray(a, 5);
    
    return 0;
}

ผลลัพธ์

Elements: 1 2 3 4 5
Elements: 2 4 6 8 10

จุดสำคัญ: Array Decay

เมื่อ Array ถูกส่งให้ฟังก์ชัน จะ "Decay" กลายเป็น Pointer:

void func(int arr[100]) {
    printf("%zu\n", sizeof(arr));  // 4 หรือ 8 (ขนาด Pointer) ไม่ใช่ 400!
}

Multidimensional Arrays

ส่ง 2D Array ต้องระบุ Column Size:

void printMatrix(int matrix[][4], int rows) {  // Column = 4 ต้องระบุ
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < 4; j++)
            printf("%d ", matrix[i][j]);
        printf("\n");
    }
}

// หรือใช้ Pointer to Array
void printMatrix2(int (*matrix)[4], int rows) { ... }

Best Practice: ใช้ Pointer + Size

// แนะนำ: ชัดเจน ใส่ const ถ้าไม่อ่านอย่างเดียว
void process(const int *data, size_t n);   // Read-only
void modify(int *data, size_t n);          // Read-Write

สรุป

  • Array ส่งให้ฟังก์ชัน = ส่ง Pointer ไป Element แรก
  • ฟังก์ชันเข้าถึง/แก้ไข Array ต้นฉบับได้
  • ต้องส่ง Size แยกต่างหาก (ยกเว้น String ที่มี \0 ท้าย)
  • ใช้ const ป้องกันการแก้ไขโดยไม่ตั้งใจ