ในการเขียนโปรแกรมบนพื้นฐานของการส่งพารามิเตอร์ไปยังฟังก์ชัน เราแบ่งการเรียกใช้ฟังก์ชันออกเป็นสองประเภท:การเรียกใช้ตามค่า และ การเรียกโดยการอ้างอิง ตามชื่อที่แนะนำในการเรียกใช้ทั้งสอง เรากำลังเรียกใช้ฟังก์ชันตามประเภทของพารามิเตอร์ในตัวเดียว เรากำลังส่งผ่านค่าจริงของพารามิเตอร์และ ในอีกทางหนึ่งเรากำลังส่งตำแหน่ง/การอ้างอิงของพารามิเตอร์
ต่อไปนี้เป็นข้อแตกต่างที่สำคัญระหว่าง 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