Ví dụ được lấy từ here.
mã chính:
#include <stdio.h>
int a;
int main() {
a = 3;
f(4, &a);
printf("%d\n", a);
return 0;
}
Gọi bằng Value:.
f(int x, int &y){
// x will be 3 as passed argument
x += a;
// now a is added to x so x will be 6
// but now nothing is done with x anymore
a += 2*y;
// a is still 3 so the result is 11
}
Giá trị được truyền vào và không ảnh hưởng đến giá trị của biến được truyền trong
Gọi bằng cách tham chiếu:
f(int x, int &y){
// x will be 3 as passed argument
x += a;
// now a is added to x so x will be 6
// but because & is used x is the same as a
// meaning if you change x it will change a
a += 2*y;
// a is now 6 so the result is 14
}
Tham chiếu được chuyển vào. Hiệu quả biến trong hàm cũng giống như biến bên ngoài.
Gọi với Copy/Restore:
int a;
void unsafe(int x) {
x= 2; //a is still 1
a= 0; //a is now 0
}//function ends so the value of x is now stored in a -> value of a is now 2
int main() {
a= 1;
unsafe(a); //when this ends the value of a will be 2
printf("%d\n", a); //prints 2
}
Giá trị được truyền vào và không ảnh hưởng đến giá trị của biến được truyền vào cho đến khi kết thúc chức năng, lúc này giá trị cuối cùng của biến chức năng được lưu trữ trong biến được truyền trong biến.
Sự khác biệt cơ bản giữa cuộc gọi bằng tham chiếu và sao chép/khôi phục sau đó là thay đổi được thực hiện cho biến chức năng sẽ không hiển thị trong biến được truyền cho đến sau khi kết thúc hàm trong khi gọi bằng thay đổi tham chiếu sẽ được nhìn thấy ngay lập tức.
Mặc dù tôi đã có thể chấp nhận câu trả lời của bạn, tôi phải đợi thêm vài giờ nữa mới có thể nhận được tiền thưởng. Cảm ơn câu trả lời tuyệt vời của bạn và tiền thưởng là của bạn tất nhiên! – mort
Ah, tôi không biết điều đó về hệ thống tiền thưởng. Tốt để biết! – mydogisbox