Sự khác biệt giữa Gọi theo Giá trị và Gọi theo Tham chiếu
Sự khác biệt chính giữa Gọi theo Giá trị và Gọi theo Tham chiếu
- Trong phương thức Gọi theo giá trị, giá trị ban đầu không được sửa đổi, trong khi ở phương thức Gọi theo tham chiếu, giá trị ban đầu được sửa đổi.
- Trong Gọi theo giá trị, một bản sao của biến được truyền, trong khi trong Gọi theo tham chiếu, chính một biến được truyền.
- Trong Gọi theo giá trị, các đối số thực tế và chính thức sẽ được tạo ở các vị trí bộ nhớ khác nhau, trong khi trong Gọi theo tham chiếu, các đối số thực tế và chính thức sẽ được tạo ở cùng một vị trí bộ nhớ.
- Gọi theo giá trị là phương thức mặc định trong các ngôn ngữ lập trình như C++, PHP, Visual Basic NET và C#, trong khi Gọi theo tham chiếu chỉ được hỗ trợ trong Java ngôn ngữ.
- Các biến gọi theo Giá trị được truyền bằng một phương thức đơn giản, trong khi các con trỏ Gọi theo tham chiếu được yêu cầu để lưu trữ địa chỉ của các biến.
Trong các ngôn ngữ lập trình, các hàm có thể được gọi theo hai cách: gọi theo giá trị và gọi theo tham chiếu.
Phương pháp gọi theo giá trị là gì?
Phương thức gọi theo giá trị sao chép giá trị của một đối số vào tham số hình thức của hàm đó. Do đó, những thay đổi được thực hiện đối với tham số của hàm chính không ảnh hưởng đến đối số.
Trong phương thức truyền tham số này, giá trị của tham số thực tế được sao chép sang tham số hình thức của hàm và tham số được lưu trữ ở các vị trí bộ nhớ khác nhau. Vì vậy, bất kỳ thay đổi nào được thực hiện bên trong các hàm đều không được phản ánh trong các tham số thực tế của hàm gọi.
Phương pháp gọi theo tham chiếu là gì?
Gọi bằng phương thức tham chiếu sẽ sao chép địa chỉ của đối số vào tham số hình thức. Trong phương thức này, địa chỉ được sử dụng để truy cập đối số thực tế được sử dụng trong lệnh gọi hàm. Nó có nghĩa là những thay đổi được thực hiện trong tham số sẽ làm thay đổi đối số được truyền.
Trong phương pháp này, việc cấp phát bộ nhớ giống như các tham số thực tế. Tất cả các thao tác trong hàm được thực hiện trên giá trị được lưu tại địa chỉ của tham số thực và giá trị được sửa đổi sẽ được lưu tại cùng một địa chỉ.
Ví dụ mã C về phương thức gọi theo giá trị
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; }
Đầu ra:
before function calling 10 value is 11 after function calling 1-0
Bởi vì biến được khai báo 'a'in main() khác với biến 'x' trong Increment(). Trong chương trình này chỉ có tên biến giống nhau nhưng địa chỉ bộ nhớ của chúng khác nhau và được lưu trữ ở các vị trí bộ nhớ khác nhau.
Java Mã ví dụ về phương thức gọi theo tham chiếu
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; }
Đầu ra:
Before call Value of a =10 After call Value of a =11
Bởi vì biến được khai báo 'a' in đang tham chiếu/trỏ tới biến 'a' trong main(). Ở đây tên biến khác nhau, nhưng cả hai đều trỏ/tham chiếu đến cùng một vị trí địa chỉ bộ nhớ.
Gọi theo giá trị so với gọi theo tham chiếu
Thông số | Gọi theo giá trị | Gọi bằng cách tham khảo |
---|---|---|
Định nghĩa | Trong khi gọi một hàm, khi bạn chuyển các giá trị bằng cách sao chép các biến, nó được gọi là “Gọi theo giá trị”. | Khi gọi một hàm, trong ngôn ngữ lập trình thay vì sao chép giá trị của các biến, địa chỉ của các biến được sử dụng, nó được gọi là “Gọi theo tham chiếu”. |
Lập luận | Trong phương pháp này, một bản sao của biến được truyền. | Trong phương pháp này, một biến được truyền vào. |
Hiệu ứng | Những thay đổi được thực hiện trong bản sao của biến không bao giờ sửa đổi giá trị của biến bên ngoài hàm. | Sự thay đổi của biến cũng ảnh hưởng tới giá trị của biến ngoài hàm. |
Thay đổi giá trị | Không cho phép bạn thực hiện bất kỳ thay đổi nào trong các biến thực tế. | Cho phép bạn thực hiện thay đổi giá trị của biến bằng cách sử dụng lệnh gọi hàm. |
Truyền biến | Giá trị của các biến được truyền bằng một phương pháp đơn giản. | Biến con trỏ được yêu cầu để lưu trữ địa chỉ của biến. |
Sửa đổi giá trị | Giá trị ban đầu không được sửa đổi. | Giá trị ban đầu được sửa đổi. |
Vị trí bộ nhớ | Lập luận thực tế và chính thức sẽ được tạo ra theo cách khác nhau vị trí bộ nhớ |
Lập luận thực tế và chính thức sẽ được tạo ra trong cùng vị trí bộ nhớ |
Sự An Toàn | Những lập luận thực tế vẫn còn an toàn vì chúng không thể sửa đổi được vô tình. |
Những lập luận thực tế không An toàn. Họ có thể vô tình bị sửa đổi nên bạn cần xử lý các thao tác đối số một cách cẩn thận. |
Mặc định | Mặc định trong nhiều chương trình ngôn ngữ như C++.PHP. Visual BasicNET và C#. |
Nó được hỗ trợ bởi hầu hết ngôn ngữ lập trình như JAVA, nhưng không như mặc định. |
Ưu điểm của việc sử dụng phương thức Call by value trong C
Ưu điểm/lợi ích của cuộc gọi theo giá trị trong C:
- Phương thức này không thay đổi biến ban đầu nên nó đang bảo toàn dữ liệu.
- Bất cứ khi nào một hàm được gọi, nó không bao giờ ảnh hưởng đến nội dung thực tế của các đối số thực tế.
- Giá trị của các đối số thực tế được truyền cho các đối số hình thức, do đó, bất kỳ thay đổi nào được thực hiện trong đối số hình thức đều không ảnh hưởng đến các trường hợp thực tế.
Ưu điểm của việc sử dụng phương pháp Gọi theo tham chiếu
Ưu điểm của việc sử dụng cuộc gọi theo phương pháp tham chiếu:
- Hàm có thể thay đổi giá trị của đối số, điều này khá hữu ích.
- Nó không tạo dữ liệu trùng lặp để chỉ giữ một giá trị, giúp bạn tiết kiệm dung lượng bộ nhớ.
- Trong phương pháp này, không có bản sao của đối số được đưa ra. Vì thế nó được xử lý rất nhanh.
- Giúp bạn tránh những thay đổi được thực hiện do nhầm lẫn
- Người đọc mã không bao giờ biết rằng giá trị có thể được sửa đổi trong hàm.
Nhược điểm của việc sử dụng phương thức Gọi theo giá trị
Dưới đây là những nhược điểm/nhược điểm chính của phương thức gọi theo giá trị:
- Những thay đổi đối với tham số thực tế cũng có thể sửa đổi các biến đối số tương ứng
- Trong phương thức này, đối số phải là biến.
- Bạn không thể trực tiếp thay đổi một biến trong thân hàm.
- Đôi khi đối số có thể là những biểu thức phức tạp
- Có hai bản sao được tạo cho cùng một biến không hiệu quả về bộ nhớ.
Nhược điểm của việc sử dụng Gọi bằng phương pháp tham chiếu
Dưới đây là những nhược điểm chính của việc sử dụng lệnh gọi theo phương thức tham chiếu:
- Đảm bảo không null mạnh mẽ. Hàm lấy tham chiếu cần đảm bảo rằng dữ liệu đầu vào không có giá trị rỗng. Do đó, không cần phải thực hiện kiểm tra null.
- Việc truyền tham chiếu làm cho hàm không thuần túy về mặt lý thuyết.
- Bảo đảm trọn đời là một vấn đề lớn với tài liệu tham khảo. Điều này đặc biệt nguy hiểm khi làm việc với lambdas và các chương trình đa luồng.