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

ความแตกต่างระหว่างการโทรด้วยมูลค่าและการโทรโดยการอ้างอิง


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

ต่อไปนี้เป็นข้อแตกต่างที่สำคัญระหว่าง 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