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ớ.
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.
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.