ในการเขียนโปรแกรมบนพื้นฐานของการส่งพารามิเตอร์ไปยังฟังก์ชัน เราแบ่งการเรียกใช้ฟังก์ชันออกเป็นสองประเภท:การเรียกใช้ตามค่า และ การเรียกโดยการอ้างอิง ตามชื่อที่แนะนำในการเรียกใช้ทั้งสอง เรากำลังเรียกใช้ฟังก์ชันตามประเภทของพารามิเตอร์ในตัวเดียว เรากำลังส่งผ่านค่าจริงของพารามิเตอร์และ ในอีกทางหนึ่งเรากำลังส่งตำแหน่ง/การอ้างอิงของพารามิเตอร์
ต่อไปนี้เป็นข้อแตกต่างที่สำคัญระหว่าง Call by Value และ Call by Reference
| ซีเนียร์ เลขที่ | คีย์ | โทรตามค่า | โทรโดยอ้างอิง |
|---|---|---|---|
| 1 | หลักการตั้งชื่อ | ในประเภทนี้ ค่าของพารามิเตอร์จะถูกส่งต่อสำหรับการเรียกใช้ฟังก์ชัน ดังนั้นจึงมีชื่อว่า Call by Value | ในทางกลับกัน ในประเภทนี้ การอ้างอิงของพารามิเตอร์จะถูกส่งต่อเพื่อเรียกใช้ฟังก์ชัน ดังนั้นจึงมีชื่อว่า Call by Reference |
| 2 | การใช้งานภายใน | In Call by value ค่าของพารามิเตอร์ที่เราส่งไปในระหว่างการเรียกใช้ฟังก์ชันจะถูกคัดลอกไปยังอาร์กิวเมนต์ในเครื่องจริงของฟังก์ชัน | ในการโทรโดยการอ้างอิงที่อยู่ตำแหน่ง/การอ้างอิงของพารามิเตอร์ที่ส่งผ่านจะถูกคัดลอกและกำหนดให้กับอาร์กิวเมนต์ในเครื่องของฟังก์ชัน ดังนั้นทั้งพารามิเตอร์ที่ส่งผ่านและอาร์กิวเมนต์ที่แท้จริงจะอ้างอิงถึงตำแหน่งเดียวกัน |
| 3 | ผลกระทบของการเปลี่ยนแปลง | เนื่องจากค่าของพารามิเตอร์ที่ส่งผ่านจะถูกคัดลอกไปยังอาร์กิวเมนต์ของฟังก์ชัน ดังนั้นการเปลี่ยนแปลงใดๆ ที่เกิดขึ้นในอาร์กิวเมนต์ภายในฟังก์ชันจะไม่สะท้อนให้เห็นในพารามิเตอร์ที่ส่งผ่าน | เนื่องจากทั้งอาร์กิวเมนต์และพารามิเตอร์ที่ส่งผ่านอ้างอิงถึงตำแหน่งเดียวกัน ดังนั้นการเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับอาร์กิวเมนต์ภายในฟังก์ชันจะสะท้อนให้เห็นในพารามิเตอร์ที่ส่งผ่าน |
| 4 | ตำแหน่งหน่วยความจำที่อ้างอิง | ตำแหน่งหน่วยความจำที่อ้างอิงทั้งพารามิเตอร์ที่ส่งผ่านและอาร์กิวเมนต์ที่แท้จริงของฟังก์ชันต่างกัน | ตำแหน่งหน่วยความจำที่อ้างอิงโดยพารามิเตอร์ที่ส่งผ่านและอาร์กิวเมนต์ที่แท้จริงของฟังก์ชันเหมือนกัน |
| 5 | ภาษาที่รองรับ | Call by value ได้รับการสนับสนุนโดยภาษาเช่น:C++.PHP Visual Basic NET และ C# | การโทรโดยการอ้างอิงได้รับการสนับสนุนโดย JAVA เป็นหลัก |
ตัวอย่างการโทรด้วยมูลค่าเทียบกับการโทรโดยการอ้างอิง
ByValue.c
#include <stdio.h>
class ByValue{
void swapByValue(int, int); /* Prototype */
int main(){
int n1 = 10, n2 = 20;
swapByValue(n1, n2);
printf("n1: %d, n2: %d\n", n1, n2);
}
void swapByValue(int a, int b){
int t;
t = a; a = b; b = t;
}
} ผลลัพธ์
n1: 10, n2: 20
ตัวอย่าง
ByReference.c
#include <stdio.h>
class ByReference{
void swapByReference(int*, int*);
int main(){
int n1 = 10, n2 = 20;
swapByReference(&n1, &n2);
printf("n1: %d, n2: %d\n", n1, n2);
}
void swapByReference(int *a, int *b){
int t;
t = *a; *a = *b; *b = t;
}
} ผลลัพธ์
n1: 20, n2: 10