c ho phép sử dụng á ontrỏ trỏ tới á ontrỏ khá giống như là trò tới dữ liệu Để làm việ đó húng ta hỉ ần thêm một dấu sao (*) ho mỗ
3.2.5. Truyền thamsố bằng contrỏ
Chúng ta quay trở lại với ví dụ kinh điển, đó là hàm hốn vị. Cho hai số ngun a và b, muốn viết hàm hoán vị hai số này. Nếu viết như sau:
Ví dụ 3.2.5
#include <stdio.h> //define MAX 10 int mang[MAX], n; void swap (int X, int y)
{ int tmp; tmp - x; x = y; y = tmp; } void main() { int X - 5, y - 10; swap(x,y);
printf(“ Sau khi hoan vi: x=%d, y= %d”,x,y); getch();
}
Thì kết quả chương trình vẫn in ra X = 5 và y = 10
Việc gọi hàm swap(x,y) chỉ làm truyền tham trị tức là biến X của hàm main truyền giá trị cho biến X của hàm swap, tương tự biến y của hàm main truyền giá trị cho biến y của hàm swap, còn về bản chất X trong hàm main và X frong ham swap là hai biến cục bộ của hai hàm, chúng được cấp phát ở hai vị trí khác nhau trong bộ nhớ. Hàm swap() ở trên chỉ làm việc với hai biến x,y của hàm swap chứ không làm việc với hai biến x,y của hàm main. Nói cách khác sự hốn vị chỉ xảy ra với hai biến x,y của hàm swap. Trong khi đó mục đích của chúng ta là hốn vị hai giá trị của biến X, y của hàm main. Vậy để giải quyết những vấn đề như thế này phải làm thế nào? Câu trả lời chính là truyền tham số là con trỏ cho hàm swap. Chương trình trên được viết lại như sau:
Ví dụ 3.2.6
#include <stdio.h> #defĩne MAX 10 int mang[MAX], n; void swap (int *x, int ♦y)
{ int tmp; tmp = *x; *x = *y; *y - tmp; } void main() { int X = 5, y = 10; swap(&x,&y);
printf(“ Saukhi hoan vi: x=%d, y= %d”,x,y); getch();
}
Lúc này kết quả in ra chính xác là X = 10, y=5
Bởi vì lời gọi hàm swap(&x,&y) đã truyền địa chỉ của biến X cho con trỏ X của hàm swap, địa chỉ của biến y cho con trỏ y của hàm swap. Cho nên việc hoán vị đúng là xảy ra trên hai vùng nhớ của biến X, y.
Tóm lại, nếu chúng ta muốn làm việc trực tiếp trên vùng nhớ của các biến được truyền vào trong lời gọi hàm thì khi truyền phải truyền theo tham số chứ không phải truyền tham trị.