การส่ง Structure ทั้งชุด (Pass by Value)
ส่งชื่อตัวแปร Structure ไปใน Function Call รับใน Structure อีกตัวหนึ่งใน Function Header
ข้อเสีย
- สร้าง **Copy ของ Structure ทั้งชุด** ใหม่ → ใช้หน่วยความจำมาก
- ช้ากว่าการส่ง Pointer
- การเปลี่ยนแปลงในฟังก์ชัน **ไม่ส่งผลกลับ** ตัวแปรต้นทาง
ตัวอย่างโปรแกรม
#include <stdio.h>
// ประกาศ Structure
struct add {
int var1;
int var2;
} a;
// ฟังก์ชันรับ Structure ทั้งชุด (Pass by Value)
void show(struct add a) {
int sum = a.var1 + a.var2;
printf("Added value is %d\n", sum);
}
int main() {
struct add a;
printf("Enter variable 1: ");
scanf("%d", &a.var1);
printf("Enter variable 2: ");
scanf("%d", &a.var2);
show(a); // ส่ง copy ของ a
return 0;
}
ผลลัพธ์:
Enter variable 1: 30
Enter variable 2: 40
Added value is 70
วิธีที่ดีกว่า: ส่ง Pointer (Pass by Reference)
// ฟังก์ชันรับ Pointer to Structure
void show_ptr(struct add *ptr) {
int sum = ptr->var1 + ptr->var2;
printf("Added value is %d\n", sum);
// สามารถแก้ไขค่าใน struct ต้นทางได้
ptr->var1 = 100;
}
int main() {
struct add a = {30, 40};
show_ptr(&a); // ส่ง address
return 0;
}
เปรียบเทียบ
| วิธี | Syntax | Memory | Speed | Modify Original? |
|---|---|---|---|---|
| Pass by Value | func(struct s) | Copy ทั้งชุด | ช้า (Struct ใหญ่) | ไม่ได้ |
| Pass by Reference | func(struct *s) | แค่ Pointer (4/8 bytes) | เร็ว | ได้ |
เมื่อไหร่ควรใช้ Pass by Value?
- Struct ขนาดเล็ก (ไม่เกิน 16-32 bytes)
- ไม่ต้องการแก้ไขค่าต้นทาง
- ต้องการความปลอดภัย (Immutable)