Hãy giả sử bạn gán một giá trị của NULL
đến trước khi bạn gọi hàm f1
.Bây giờ cách thức f1 được định nghĩa nó lấy đối số của nó (con trỏ đến một số int
) theo giá trị. Đó là b
sẽ là một loại khác là int *
sẽ là sao chép của a
. Vì vậy, b
cũng sẽ có giá trị là NULL
. Bây giờ trong f1
bạn thay đổi giá trị bằng b
bằng cách gán cho nó địa chỉ bộ nhớ được cấp phát động bằng cách sử dụng malloc
. Giả sử địa chỉ bộ nhớ là 0x123
. Do chuyển nhượng này, b
đã thay đổi giá trị của nó từ NULL
thành 0x123
nhưng a
(trong main
) tiếp tục giữ NULL
, vì thay đổi b sẽ không thay đổi a
vì chúng là hai biến riêng biệt. Kết quả của việc này là khi bạn trở về từ hàm f1
một sẽ vẫn không thay đổi.
Có 2 cách để giải quyết vấn đề này. Một trong những bạn có thể làm cho hàm f1
trả về giá trị của số b
đã thay đổi và sau đó gán nó vào một số main
và hai, bạn có thể chuyển từng địa chỉ để bất kỳ thay đổi nào được thực hiện trong f1
cũng sẽ ảnh hưởng đến số main
.
// f1 now returns the value of b.
int* f1() {
int *b = malloc(sizeof(int));
*b = 5;
return b;
}
int main() {
int *a = NULL;
a = f1(); // assign the return value of f1 to a.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}
.
// f1 now takes the address of a.
void f1(int **b) {
*b = malloc(sizeof(int)); // you are actually altering a indirectly.
**b = 5;
}
int main() {
int *a = NULL;
f1(&a); // now pass the address of a to f1.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}
Điều này một lần nữa được truyền theo giá trị. u r chuyển địa chỉ của một giá trị. ** Không vượt qua bằng cách tham chiếu trong C ** – raj
Đủ công bằng. Cập nhật để chính xác hơn trong C. – Dusty