Đó không phải là thông qua tham chiếu, mà là thông qua giá trị như những người khác đã nêu.
Ngôn ngữ C là giá trị truyền qua không có ngoại lệ. Truyền con trỏ làm tham số không có nghĩa là tham chiếu qua.
Quy tắc như sau:
Một hàm không thể thay đổi giá trị tham số thực tế.
Chúng ta hãy thử xem sự khác biệt giữa các tham số vô hướng và con trỏ của hàm.
Biến vô hướng
Chương trình ngắn này hiển thị giá trị truyền qua sử dụng biến vô hướng. param
được gọi là tham số chính thức và variable
tại chức năng gọi được gọi là tham số thực tế. Lưu ý tăng param
trong chức năng không thay đổi variable
.
#include <stdio.h>
void function(int param) {
printf("I've received value %d\n", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %d\m", variable);
return 0;
}
Kết quả là
I've received value 111
variable=111
Ảo tưởng về sự qua lại
Chúng tôi thay đổi các đoạn mã một chút. param
bây giờ là một con trỏ
#include <stdio.h>
void function2(int *param) {
printf("I've received value %d\n", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %d\n", variable);
return 0;
}
Kết quả là
I've received value 111
variable=112
Điều đó làm cho bạn tin rằng tham số đã được thông qua tham chiếu. Nó không phải là. Nó được thông qua bởi giá trị, giá trị param là một địa chỉ. Giá trị kiểu int được tăng lên và đó là hiệu ứng phụ khiến chúng ta nghĩ rằng đó là một lệnh gọi hàm tham chiếu.
Con trỏ - thông qua giá trị
Làm thế nào chúng ta có thể hiển thị / chứng minh thực tế đó? Chà, có lẽ chúng ta có thể thử ví dụ đầu tiên về các biến vô hướng, nhưng thay vì vô hướng, chúng ta sử dụng địa chỉ (con trỏ). Hãy xem nếu điều đó có thể giúp đỡ.
#include <stdio.h>
void function2(int *param) {
printf("param's address %d\n", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %d\n", ptr);
return 0;
}
Kết quả sẽ là hai địa chỉ bằng nhau (đừng lo lắng về giá trị chính xác).
Kết quả ví dụ:
param's address -1846583468
ptr's address -1846583468
Theo tôi điều này chứng tỏ rõ ràng rằng con trỏ được truyền qua giá trị. Nếu không ptr
sẽ là NULL
sau khi gọi chức năng.