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