Mục lục bài viết

Các bạn đã tìm hiểu 2 cách truyền đối số là Truyền tham trị và truyền tham chiếu cho hàm trong C++. Bài này sẽ giới thiệu một cách truyền đối số nữa là truyền con trỏ cho hàm. Sau khi học xong bài này, các bạn cần hiểu được sự khác nhau giữa những cách truyền đối số cho hàm.

1. Nhắc lại cách truyền tham trị và tham chiếu

Truyền tham trị (pass by value)

void passByValue(int x){
	x++;
}
int a = 10;
passByValue(a);//lời gọi hàm truyền tham trị

Khi hàm passByValue(a); được gọi, thì biến x trong hàm sẽ được cấp phát một vùng nhớ trên bộ nhớ. Giá trị của biến a sẽ được gán cho biến x và lưu ở vùng nhớ của biến x. Lúc này, x == 10.

Khi thực hiện lệnh: x++; thì chỉ có biến x tăng lên 1 (x == 11). Sau khi hàm kết thúc, biến x cũng sẽ bị hủy và giá trị biến a không thay đổi.

Truyền tham chiếu (pass by reference)

void passByValue(int &x){
	x++;
}
int a = 10;
passByValue(a);//lời gọi hàm truyền tham chiếu

Khi hàm passByValue(a); được gọi, thì biến x trong hàm sẽ có cùng địa chỉ vùng nhớ với biến a. Tức là 2 biến có cùng 1 vùng nhớ.

Bản chất truyền tham chiếu

Khi thực hiện lệnh: x++; thì biến x tăng lên 1 (x == 11). Giá trị này được lưu ở vùng nhớ chung của biến x và biến a, dẫn đến giá trị truy xuất từ biến a cũng thay đổi theo. Sau khi hàm kết thúc, biến x cũng sẽ bị hủy và giá trị biến a bị thay đổi.

2. Truyền con trỏ cho hàm

Chương trình C++ minh họa truyền con trỏ cho hàm

#include <iostream>
#include <string>
using namespace std;

void passByValue(int *x){
	cout<<"Dia chi cua con tro x:"<<&x<<endl;
	(*x)++;
}

int main() {
	int a = 10;
	passByValue(&a);//lời gọi hàm truyền con trỏ
	cout<<"Dia chi cua bien a:"<<&a<<endl;
	cout<<"Gia tri cua bien a bi thay doi:"<<a<<endl;
	system("pause");
}
Kết quả
Dia chi cua con tro x:00F1FB28
Dia chi cua bien a:00F1FBFC
Gia tri cua bien a bi thay doi:11

Khi hàm passByValue(&a); được gọi, thì biến con trỏ x trong hàm sẽ được cấp phát một vùng nhớ để lưu địa chỉ của biến a.

Bản chất truyền con trỏ cho hàm

Khi thực hiện lệnh: (*x)++; thì biến con trỏ x truy cập vào vùng nhớ của biến a. Rồi lấy giá trị trong vùng nhớ của biến a tăng lên 1 và lưu lại trong vùng nhớ đó. Lúc này, giá trị truy xuất được từ biến a sẽ tăng lên 1 (a==11).

Sau khi hàm kết thúc, biến con trỏ x cũng sẽ bị hủy và giá trị biến a bị thay đổi.

Nhận xét: Việc sử dụng truyền con trỏ cho hàm sẽ tốn bộ nhớ (bộ nhớ lưu con trỏ) hơn truyền tham chiếu (truyền tham chiếu thì các biến sử dụng chung vùng nhớ). Nhưng không nên lạm dụng cách truyền nào mà nên sử dụng phù hợp cho từng yêu cầu cụ thể của chương trình.

Tác giả

Vinh Lê

Giảng viên CNTT, chia sẻ tutorial lập trình & phần cứng tại Góc Học IT. Hơn 500 bài viết hướng dẫn từ cơ bản đến nâng cao.

Gợi ý tiếp theo

Kỹ thuật cấp phát bộ nhớ động và minh họa với C++

Học tiếp