การส่ง 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ป้องกันการแก้ไขโดยไม่ตั้งใจ