Giúp về con trỏ trong hoán vị

,Mọi người giúp mình về sự khác biệt của 2 hàm hoán vị sau với

#include <stdio.h>
void hoanvi(int &a,int &b)
{
	
	int t=a;a=b;b=t;
}
int main(int argc, char *argv[])
{
	int a,b;
	printf("Nhap lan luot a ,b: ");
	scanf("%d%d",&a,&b);
 	hoanvi(a,b);
 	printf("%d %d ",a,b);
	
	return 0;
}


#include <stdio.h>
void hoanvi(int *a,int *b)
{
	
	int t=*a;*a=*b;*b=t;
}
int main(int argc, char *argv[])
{
	int a,b;
	printf("Nhap lan luot a ,b: ");
	scanf("%d%d",&a,&b);
 	hoanvi(&a,7b);
 	printf("%d %d ",a,b);
	
	return 0;
}

Thế này, trước khi hiểu 2 cái hàm đó bạn cần hiểu biến, địa chỉ biến, references, pointers và cách thực thi của function.

  • Tất cả biến mình khai báo điều có địa chỉ, địa chỉ này là địa chỉ tường đối trên ổ cứng.
  • References là tên của một địa chỉ, còn gọi là đinh danh (alias) của một biến.
  • Khi khỏi tạo một biến reference thì phải có giá trị cho nó và không đổi nó.
int num = 10; //biến num có giá trị 10, địa chỉ là 0x1234
int &var1; //Sai. Khởi tạo 1 reference nhưng không có giá trị
int &var2 = num; //Đúng. Var2 là định danh của num, là tên cho địa chỉ biến num.
var2 = 11; //gán giá trị 11 vào vùng nhớ tại địa chị mà var định danh. Khi này num cũng có giá trị 11
printf("%p", &num);//0x1234
printf("%p", &var2);//0x1234
printf("%d", num); //11
printf("%d", var2);; //11
  • Pointer là biến chứa địa chỉ của một biến khác.
  • Khi chương trình thực hiện, khi gặp một hàm nó sẽ dùng tại, lưu toàn bộ công việc hiện tại. Nhảy vào stack của hàm đó để thử hiện, chỉ cần bạn hiểu cách hình thành 1 stack frame là hiểu được sự giống nhau của 2 hàm hoán vị đó.
1 Like

Hàm có tham chiếu thì C++ mới có tham chiếu, C không có.

2 Likes

con trỏ thì mình nắm khá rồi chỉ là ko hiểu cái chắc mà cái chương trình thứ 1 hooat dong

Theo em hiểu khi ta truyền tham số cho hàm theo kiểu tham trị như sau:

int a = 5;
int b = 4;
void hoanvi(int a, int b); // hàm
hoanvi(a,b);// gọi hàm

thì khi ta truyền a và b vào cho hàm hoanvi, thì chương trình sẽ tạo ra hai bản sao có giá trị bằng a và b nhưng ở địa chỉ vùng nhớ khác, và thực hiện bên trong thân hàm. Giá trị của hai bản sao thay đổi, nhưng giá trị của a và b bên ngoài không thay đổi.

Còn khi ta truyền theo tham chiếu:

int a =5;
int b =4;
void hoanvi(int &a, int &b);
hoanvi (a,b); // gọi hàm

thì sẽ truyền trực tiếp hai biến a, b được khai báo bên ngoài, và việc hoán vị bên trong thân hàm sẽ làm thay đổi giá trị của hai biến a,b bên ngoài.
Em hiểu thế, các bác nếu thấy sai chỉnh giúp em với ạ : ))

Đúng’ss dzồi’ss, tuy bạn lưu ý như @rogp10 đã nói là C không có tham chiếu, C++ mới có.

2 Likes

Tớ chỉ hiểu đơn giản là cách viết 1 của C++, Cách viết 2 của C.
Để test, bạn chỉ cần đặt tên file là *.c thì cách 1 sẽ bị lỗi, không chạy, cách 2 chạy ngon :v:

1 Like

Bạn nói đúng rùi, vùng nhớ này gọi là stack.

Cài này chưa chính xác. Nó vẫn tạo 2 bản sao của a và b, và gán giá trị bằng với giá trị a và b như bạn nói ở trên. Tuy nhiên giá trị của a, b mới lúc này là reference (tham chiếu) mang định danh (địa chỉ) của a, b thực. Nên đổi giá trị tại cùng 1 ô nhớ (địa chỉ) nên giá trị a, b bên ngoài hàm có thể thay đổi được khi dùng tham chiếu.

2 Likes

Cảm ơn bạn. Lúc viết t nghĩ mình không hiểu chính xác : ))

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