Kỹ thuật lập trình truyền con trỏ cho hàm trong C++

Đây là bài 40/43 bài của series môn học Nhập môn lập trình

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.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Kỹ thuật lập trình với kiểu cấu trúc và con trỏ trong C++Kỹ thuật cấp phát bộ nhớ động và minh họa với C++ >>
Chia sẻ trên mạng xã hội:

Để lại một bình luận

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.