Không hoán đổi giá trị của 2 số được

Nhờ mọi người giúp e với ạ. e hoán đổi giá trị giữa hai biến a và b nhưng không được,mọi người sửa lại và giải thích hộ e với ạ

	void swap(int a, int b) 
	{
		int c = a;
		a = b;
		b = c;
	}
	int main()
	{
		int a = 1, b = 2;
		swap(a, b);
		printf("a=%d",a);
		printf("b=%d", b);
		
	}
}

google: c++ pass by reference parameter

6 Likes

tham số a, b phải truyền kiểu tham chiếu ( call by reference ) , truyền tham trị ( call by value ) như vậy thì không swap được. sửa a , b thành &a, &b

3 Likes

Mọi người nên để ý là tag C nha.

Cho nên 2 cách trên không làm được trong C.

Và cũng chưa trả lời được câu này của thớt luôn. :slight_smile:


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 ab. 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. :slight_smile:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?