Hàm và truyền tham số

Một phần của tài liệu §¹i häc quèc gia hµ néi khoa c«ng nghÖgi¸o tr×nh tin häc c¬ së phÇn lËp tr×nh potx (Trang 101 - 102)

VI. 1 Nguyờn mẫu (prototype) hàm

Hàm và truyền tham số

Với C việc tryền tham số cho hàm được thực hiện qua cơ chế truyền tham trị. Tức là trong hàm chỳng ta sử dụng tham số hỡnh thức như là một bản sao dữ liệu của tham số được truyền cho hàm, do vậy chỳng khụng làm thay đổi giỏ trị của tham số truyền vào. Hay núi khỏc đi, cỏc tham số hỡnh thức là cỏc biến cụ bộ trong hàm, sự thay đổi của nú trong hàm khụng ảnh hưởng tới cỏc biến bờn ngoài.

Vậy trong trường hợp thực sự cần thay đổi giỏ trị của tham số thỡ thế nào? chẳng hạn bạn cần hàm để hoỏn đổi giỏ trị của a và b.

Nếu bạn viờt hàm

void doicho(int x, int y) { int tg; tg = x; x=y; y=tg; } hàm này đỳng cỳ phỏp nhưng với cỏc lệnh sau: int a = 4; int b = 6;

printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b); doicho(a,b);

printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b);

kết quả in ra là

truoc khi goi ham doi cho a=4,b=6 sau khi goi ham doi cho a=4,b=6

Rừ ràng hàm đổi chỗ (doicho) thực hiện khụng đỳng, nguyờn nhõn là với hàm doicho x, y là hai biờn cục bộ, khi gọi hàm doicho(a,b) chương trỡnh dịch cấp phỏt vựng nhớ cho hai biến (tham số hỡnh thức) x, y và sao chộp giỏ trị của a vào x, b vào y, mọi thao tỏc trong hàm doicho đều thực hiờn trờn x, y mà khụng ảnh hưởng tới a và b, kết quả là a, b khụng đổi.

Để khắc phục điều này chỳng ta định nghĩa hàm với tham số là con trỏ và khi gọi cỏc bạn hóy truyền cho nú địa chỉ của tham số thực sự, vớ dụ:

void doicho2(int * x, int *y) { int tg; tg = *x; *x = *y; *y = tg; } Lỳc này với cỏc lệnh sau: int a = 4; int b = 6;

printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b); doicho(&a,&b);

printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b);

kết quả in ra là

truoc khi goi ham doi cho a = 4,b = 6 sau khi goi ham doi cho a = 6 , b = 4

---

Một phần của tài liệu §¹i häc quèc gia hµ néi khoa c«ng nghÖgi¸o tr×nh tin häc c¬ së phÇn lËp tr×nh potx (Trang 101 - 102)