Về bài của thớt thì trước tiên bạn cần biết trong C chỉ có duy nhất một kiểu truyền vào hàm là pass by value (nghĩa là truyền giá trị).
Cho nên việc bạn truyền a, b vào hàm thì a, b trong hàm nó sẽ là hai biến hoàn toàn khác chỉ là cùng tên và cùng giá trị của a, b ngoài main mà thôi. (Có thể kiểm chứng bằng cách in ra địa chỉ của a, b trong và ngoài hàm).
Còn để sửa được code của bạn thì bạn sẽ cần thêm một khái niệm nữa là con trỏ.
Vậy con trỏ là gì?
Thực chất nó cũng chỉ là một kiểu biến mà nó sẽ lưu địa chỉ của các biến khác.
Vd:
int a = 5;
int *ptrA = &a;
Khi bạn dùng printf để in ra prtA thì nó sẽ in ra địa chỉ của a. (Hay nói cách khác là in ra &a)
Và để truy cập vào dữ liệu của biến được trỏ đến bạn có thể dùng *prtA. (Theo vd trên thì khi in giá trị của *prtA sẽ ra 5)
Giờ áp dụng vào bài của bạn thì sẽ phải sửa lại hàm swap() thành:
void swap(int *a, int *b) {
int c = *a;
int *a = *b;
int *b = c;
}
Và khi gọi hàm bạn phải truyền vào swap() là địa chỉ của a và b. Nghĩa là phải gọi như này:
swap(&a, &b);
Khá là rắc rối phải không. Nếu chưa có chút hiểu biết nào về con trỏ thì bạn nên kiếm qua tài liệu về nó trước rồi mới tự trả lời tại sao đoạn code mình sửa lại hoạt động được.
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?