Truyền tham số trong C/C++ - Tham trị, tham biến và tham chiếu (tham trỏ)

Phân biệt các cách truyền tham số cho chương trình con (hàm) trong C/C++.

Để đơn giản cho việc phân biệt các cách truyền tham số cho hàm thông qua bài toán "hoán đổi giá trị 2 biến kiểu nguyên". Có những cách làm sau:

1. THAM TRỊ (by value)

Mã đầy đủ (để minh họa) có thể sẽ như sau:

#include &l;stdio.h>
#include <conio.h>

void hoanDoi(int a, int b)
{
	int tam = a;
	a = b;
	b = tam;
}

int main()
{
	int x = 5;
	int y = 8;
	printf("Truoc khi hoan doi: x=%d, y=%d\n", x, y);
	hoanDoi(x, y);
	printf("Sau khi hoan doi:   x=%d, y=%d\n", x, y);
	getch();
	return 0;
}

Kết quả thực thi:

Truoc khi hoan doi: x=5, y=8
Sau khi hoan doi:   x=5, y=8

Sau khi thực thi, ta thấy giá trị của x và y vẫn như ban đầu (nghĩa là không hoán đổi). Lý do đơn giản là vì khi truyền tham số, C sẽ chỉ truyền giá trị của nó hay nói nôm na là truyền bản photocopy. Do vậy, trong hàm nếu có thay đổi giá trị các bản photocopy này thì bản gốc (tức giá trị của biến ban đầu) vẫn không đụng đậy gì.

⇒ Cách này không thể sử dụng được (cho bài toán hoán đổi giá trị).

2. THAM BIẾN hay THAM TRỎ (by variable/pointer)

Mã đầy đủ (để minh họa) có thể sẽ như sau:

#include &l;stdio.h>
#include <conio.h>

void hoanDoi(int *a, int *b)
{
	int tam = *a;
	*a = *b;
	*b = tam;
}

int main()
{
	int x = 5;
	int y = 8;
	printf("Truoc khi hoan doi: x=%d, y=%d\n", x, y);
	hoanDoi(&x, &y);
	printf("Sau khi hoan doi:   x=%d, y=%d\n", x, y);
	getch();
	return 0;
}

Kết quả thực thi:

Truoc khi hoan doi: x=5, y=8
Sau khi hoan doi:   x=8, y=5

Sau khi thực thi, ta thấy giá trị của x và y đã được hoán đổi vì theo cách này chương trình không phải truyền giá trị (value) của biến mà là địa chỉ (hay con trỏ) của biến. Do vậy, trong hàm, từ con trỏ chương trình có thể tìm tới biến (thông qua toán tử *) để thay đổi giá trị. Cách này sử dụng được nhưng yêu cầu người sử dụng phải nắm vững các thao tác cơ bản trên con trỏ (khai báo và truy xuất).

3. THAM CHIẾU (by reference)

Mã đầy đủ (để minh họa) có thể sẽ như sau:

#include &l;stdio.h>
#include <conio.h>

void hoanDoi(int &a, int &b)
{
	int tam = a;
	a = b;
	b = tam;
}

int main()
{
	int x = 5;
	int y = 8;
	printf("Truoc khi hoan doi: x=%d, y=%d\n", x, y);
	hoanDoi(x, y);
	printf("Sau khi hoan doi:   x=%d, y=%d\n", x, y);
	getch();
	return 0;
}

Kết quả thực thi:

Truoc khi hoan doi: x=5, y=8
Sau khi hoan doi:   x=8, y=5

Sau khi thực thi, ta thấy giá trị của x và y đã được hoán đổi vì theo cách này chương trình không phải truyền giá trị (value) của biến mà là tham chiếu (reference) của biến. Hay nôm na, chương trình sẽ truyền "bản gốc" chứ không phải "bản photo". CHÚ Ý: cách này đơn giản hơn nhiều so với cách dùng tham biến tuy nhiên đây là tính năng của C++! (nghĩa là chương trình C đơn thuẩn không dùng được).