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

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

  • ในวิธีการเรียกตามค่า ค่าดั้งเดิมจะไม่ถูกแก้ไข ในขณะที่วิธีการเรียกตามค่าอ้างอิง ค่าดั้งเดิมจะถูกแก้ไข
  • ในการเรียกตามค่า สำเนาของตัวแปรจะถูกส่งผ่าน ในขณะที่ในการเรียกโดยการอ้างอิง ตัวตัวแปรเองจะถูกส่งผ่าน
  • ในการเรียกตามค่า อาร์กิวเมนต์ที่เกิดขึ้นจริงและเป็นทางการจะถูกสร้างขึ้นในตำแหน่งหน่วยความจำที่แตกต่างกัน ในขณะที่ในการเรียกตามการอ้างอิง อาร์กิวเมนต์ที่เกิดขึ้นจริงและเป็นทางการจะถูกสร้างขึ้นในตำแหน่งหน่วยความจำเดียวกัน
  • การเรียกตามค่าเป็นวิธีเริ่มต้นในภาษาการเขียนโปรแกรมเช่น C++, PHP, Visual Basic NET และ C# ในขณะที่ Call by Reference รองรับเฉพาะใน Java ภาษา.
  • ตัวแปร Call by Value จะถูกส่งผ่านโดยใช้วิธีการที่ตรงไปตรงมา ในขณะที่ตัวชี้ Call by Reference จำเป็นต้องจัดเก็บที่อยู่ของตัวแปร

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

ในภาษาโปรแกรม สามารถเรียกใช้ฟังก์ชันได้สองวิธี: ซึ่งเรียกว่า Call by Value และ Call by Reference

วิธีการโทรตามมูลค่าคืออะไร?

วิธีการ Call by value จะคัดลอกค่าของอาร์กิวเมนต์ไปเป็นพารามิเตอร์ทางการของฟังก์ชันนั้น ดังนั้นการเปลี่ยนแปลงพารามิเตอร์ของฟังก์ชันหลักจึงไม่ส่งผลต่ออาร์กิวเมนต์

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

วิธีการ Call by Reference คืออะไร?

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

ในวิธีนี้ การจัดสรรหน่วยความจำจะเหมือนกับพารามิเตอร์จริง การทำงานทั้งหมดในฟังก์ชันจะดำเนินการกับค่าที่จัดเก็บไว้ที่อยู่ของพารามิเตอร์จริง และค่าที่แก้ไขแล้วจะถูกจัดเก็บไว้ที่อยู่เดียวกัน

ตัวอย่างรหัส C ของวิธีการโทรตามมูลค่า

void main() {
        int a = 10,
        void increment(int);
        Cout << "before function calling" << a;
        increment(a);
        Cout << "after function calling" << a;
        getch();

        void increment(int x) {
            int x = x + 1;
            Cout << "value is" << x;
        }

Output:

before function calling 10
value is 11
after function calling 1-0

เนื่องจากตัวแปรที่ประกาศ 'a'in main() แตกต่างจากตัวแปร 'x' ในส่วนเพิ่ม () ในโปรแกรมนี้มีเพียงชื่อตัวแปรเท่านั้นที่เหมือนกัน แต่ที่อยู่หน่วยความจำต่างกันและจัดเก็บไว้ในตำแหน่งหน่วยความจำต่างกัน

Java ตัวอย่างโค้ดของการโทรโดยวิธีอ้างอิง

Public static void main(string args[]) {
    int a = 10;
    System.out.println("Before call Value of a = ", a);
    Void increment();
    System.out.println("After call Value of a = ", a);
}

Void increment(int x) {
    int x = x + 1;
}

Output:

Before call Value of a =10
After call Value of a =11

เนื่องจากตัวแปรที่ประกาศ 'a' ในนั้นอ้างอิง/ชี้ไปที่ตัวแปร 'a' ใน main() ชื่อตัวแปรที่นี่แตกต่างกัน แต่ทั้งคู่ชี้/อ้างอิงไปยังตำแหน่งที่อยู่หน่วยความจำเดียวกัน

โทรตามมูลค่าเทียบกับโทรโดยการอ้างอิง

พารามิเตอร์ โทรตามค่า โทรตามข้อมูลอ้างอิง
คำนิยาม ขณะเรียกใช้ฟังก์ชัน เมื่อคุณส่งค่าโดยการคัดลอกตัวแปร จะเรียกว่า “การเรียกตามค่า” ในขณะที่เรียกใช้ฟังก์ชัน ในภาษาการเขียนโปรแกรมแทนที่จะคัดลอกค่าของตัวแปร ที่อยู่ของตัวแปรจะถูกใช้ซึ่งเรียกว่า "การโทรตามการอ้างอิง"
ข้อโต้แย้ง ในวิธีนี้ สำเนาของตัวแปรจะถูกส่งผ่าน ในวิธีนี้ ตัวแปรจะถูกส่งผ่าน
ผล การเปลี่ยนแปลงที่ทำในสำเนาของตัวแปรจะไม่แก้ไขค่าของตัวแปรภายนอกฟังก์ชัน การเปลี่ยนแปลงในตัวแปรยังส่งผลต่อค่าของตัวแปรภายนอกฟังก์ชันด้วย
การเปลี่ยนแปลงมูลค่า ไม่อนุญาตให้คุณทำการเปลี่ยนแปลงใด ๆ ในตัวแปรจริง ช่วยให้คุณสามารถเปลี่ยนแปลงค่าของตัวแปรได้โดยใช้การเรียกฟังก์ชัน
การผ่านของตัวแปร ค่าของตัวแปรถูกส่งผ่านโดยใช้วิธีการที่ตรงไปตรงมา ตัวแปรตัวชี้จำเป็นต้องจัดเก็บที่อยู่ของตัวแปร
การปรับเปลี่ยนมูลค่า ค่าเดิมไม่ได้รับการแก้ไข มีการแก้ไขค่าเดิม
ตำแหน่งหน่วยความจำ ข้อโต้แย้งที่เกิดขึ้นจริงและเป็นทางการ
จะถูกสร้างแตกต่างกันไป
ตำแหน่งหน่วยความจำ
ข้อโต้แย้งที่เกิดขึ้นจริงและเป็นทางการ
จะถูกสร้างขึ้นในทำนองเดียวกัน
ตำแหน่งหน่วยความจำ
ความปลอดภัย ข้อโต้แย้งที่แท้จริงยังคงอยู่
ปลอดภัยเพราะไม่สามารถดัดแปลงได้
โดยบังเอิญ.
ข้อโต้แย้งที่เกิดขึ้นจริงไม่ได้
ปลอดภัย. พวกเขาสามารถเป็น
ถูกแก้ไขโดยไม่ได้ตั้งใจ ดังนั้นคุณจึงต้องจัดการการดำเนินการอาร์กิวเมนต์อย่างระมัดระวัง
ค่าเริ่มต้น ค่าเริ่มต้นในการเขียนโปรแกรมจำนวนมาก
ภาษาเช่น C++.PHP Visual Basic NET และ C#
ได้รับการสนับสนุนจากส่วนใหญ่
ภาษาโปรแกรมเช่น JAVA แต่
ไม่เป็นค่าเริ่มต้น

ข้อดีของการใช้วิธี Call by value ใน C

ข้อดี/ประโยชน์ของการโทรตามมูลค่าใน C:

  • เมธอดนี้จะไม่เปลี่ยนตัวแปรเดิม ดังนั้นจึงเป็นการรักษาข้อมูล
  • เมื่อใดก็ตามที่เรียกใช้ฟังก์ชัน จะไม่ส่งผลกระทบต่อเนื้อหาที่แท้จริงของอาร์กิวเมนต์จริง
  • ค่าของอาร์กิวเมนต์จริงที่ส่งผ่านไปยังอาร์กิวเมนต์ที่เป็นทางการ ดังนั้นการเปลี่ยนแปลงใดๆ ที่เกิดขึ้นในการโต้แย้งที่เป็นทางการจะไม่ส่งผลกระทบต่อกรณีจริง

ข้อดีของการใช้ Call โดยวิธีอ้างอิง

ข้อดีของการใช้การโทรโดยวิธีอ้างอิง:

  • ฟังก์ชันสามารถเปลี่ยนค่าของอาร์กิวเมนต์ได้ซึ่งค่อนข้างมีประโยชน์
  • ไม่สร้างข้อมูลที่ซ้ำกันเพื่อเก็บค่าเพียงค่าเดียวซึ่งช่วยให้คุณประหยัดพื้นที่หน่วยความจำ
  • ในวิธีนี้ จะไม่มีสำเนาของการโต้แย้งเกิดขึ้น ดังนั้นจึงได้รับการประมวลผลอย่างรวดเร็ว
  • ช่วยให้คุณหลีกเลี่ยงการเปลี่ยนแปลงที่ทำโดยไม่ได้ตั้งใจ
  • บุคคลที่อ่านโค้ดไม่เคยรู้ว่าค่านั้นสามารถแก้ไขได้ในฟังก์ชัน

ข้อเสียของการใช้วิธี Call by value

นี่คือข้อเสีย/ข้อเสียที่สำคัญของการโทรตามมูลค่า:

  • การเปลี่ยนแปลงพารามิเตอร์จริงยังสามารถแก้ไขตัวแปรอาร์กิวเมนต์ที่เกี่ยวข้องได้
  • ในวิธีนี้ อาร์กิวเมนต์ต้องเป็นตัวแปร
  • คุณไม่สามารถเปลี่ยนตัวแปรในตัวฟังก์ชันได้โดยตรง
  • บางครั้งการโต้แย้งสามารถเป็นการแสดงออกที่ซับซ้อน
  • มีสองสำเนาที่สร้างขึ้นสำหรับตัวแปรเดียวกันซึ่งใช้หน่วยความจำไม่มีประสิทธิภาพ

ข้อเสียของการใช้ Call โดยวิธีอ้างอิง

นี่คือข้อเสียที่สำคัญของการใช้การโทรโดยวิธีอ้างอิง:

  • การรับประกันค่า null อย่างเข้มงวด ฟังก์ชันที่รับข้อมูลอ้างอิงจะต้องตรวจสอบให้แน่ใจว่าอินพุตนั้นไม่ใช่ค่า null ดังนั้นจึงไม่จำเป็นต้องตรวจสอบค่า null
  • การส่งผ่านโดยการอ้างอิงทำให้ฟังก์ชันไม่บริสุทธิ์ในทางทฤษฎี
  • การรับประกันตลอดอายุการใช้งานถือเป็นปัญหาใหญ่เกี่ยวกับการอ้างอิง สิ่งนี้เป็นอันตรายอย่างยิ่งเมื่อทำงานกับแลมบ์ดาและโปรแกรมแบบมัลติเธรด