Computer >> Máy Tính >  >> Lập trình >> lập trình C

Sự khác biệt giữa Gọi theo giá trị và Gọi theo tham chiếu

Trong lập trình trên cơ sở truyền tham số cho một hàm, chúng ta đã phân loại lệnh gọi hàm thành hai:Gọi theo giá trị và Gọi theo tham chiếu. khác, chúng tôi đang chuyển vị trí / tham chiếu của tham số.

Sau đây là những điểm khác biệt quan trọng giữa Gọi theo giá trị và Gọi theo tham chiếu.

Sr. Không. Phím Gọi theo Giá trị Gọi bằng Tham chiếu
1 Quy ước đặt tên Như trong kiểu này, giá trị của tham số được chuyển cho lệnh gọi hàm, do đó nó được đặt tên là Gọi theo giá trị. Mặt khác, trong kiểu này, tham chiếu của tham số được truyền để gọi hàm nên nó được đặt tên là Gọi theo tham chiếu.
2 Triển khai nội bộ Trong Gọi theo giá trị, giá trị của tham số chúng ta đã truyền trong khi gọi hàm được sao chép vào đối số cục bộ thực của hàm. Trong Cuộc gọi bằng tham chiếu, địa chỉ vị trí / tham chiếu của tham số đã truyền được sao chép và gán cho đối số cục bộ của hàm để cả tham số được truyền và đối số thực đều tham chiếu đến cùng một vị trí.
3 Ảnh hưởng của các thay đổi Vì giá trị của tham số đã truyền được sao chép vào đối số của hàm nên bất kỳ thay đổi nào được thực hiện trong đối số bên trong hàm sẽ không được phản ánh trong tham số đã truyền. Vì cả đối số và tham số được truyền đều đề cập đến cùng một vị trí nên bất kỳ thay đổi nào được thực hiện đối với đối số bên trong hàm đều được phản ánh trong tham số đã truyền.
4 Vị trí bộ nhớ được giới thiệu Vị trí bộ nhớ đã tham chiếu cả tham số đã truyền và các đối số thực tế của hàm là khác nhau. Vị trí bộ nhớ được tham chiếu bởi cả tham số đã truyền và đối số thực tế của hàm đều giống nhau.
5 Các ngôn ngữ được hỗ trợ. Gọi theo giá trị được hỗ trợ bởi các ngôn ngữ như:C ++. PHP. Visual Basic NET và C #. Cuộc gọi tham chiếu chủ yếu được hỗ trợ bởi JAVA.

Ví dụ về Gọi theo giá trị so với Gọi theo tham chiếu

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;
   }
}

Đầu ra

n1: 10, n2: 20

Ví dụ

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;
   }
}

Đầu ra

n1: 20, n2: 10