Em đang học về hàm trong ngôn ngữ lập trình C/C++? Trong khi truyền dữ liệu vào hàm có hai cách truyền tham chiếu và tham trị? Em rất phân vân về hai cách truyền giá trị này, trong trường hợp nào thì nên dùng cách nào? Pro nào có thể giải thích một cách dễ hiểu nhất giúp em được không ạ?
Tại hạ đi ngang qua đây tình cờ gặp các vị huynh muội đang thắc mắc một vấn đề nan giải mà tại hạ đã từng đau đầu trong 2 năm trước khi đang tu luyện môn nội công này. Hôm nay bèn xin góp một chút sức mọn hy vọng sẽ giúp ích được cho hai vị sư huynh và tiểu sư muội ở đây.hehe
Đối với lập trình hàm trong ngôn ngữ C/C++, một số hàm không cần truyền gì vào thì thôi tiểu đệ xin bỏ qua, một số hàm cần phải nhận dữ liệu từ bên ngoài vào thì gọi là truyền tham số cho hàm đó.
Truyền tham số gồm có truyền tham trị và truyền tham chiếu mà các vị huynh muội đây đang thắc mắc:
- Giống nhau: đều truyền giá trị vào hàm khi hàm được gọi
- Khác nhau:
- Truyền tham trị: truyền giá trị của biến vào hàm.
- Truyền tham chiếu: truyền địa chỉ của biến vào hàm.
Mọi thứ chỉ mới vừa bắt đầu, tại hạ xin được phép tiếp tục.
Truyền tham trị
Ý tưởng:
Khi truyền biến vào hàm theo cách truyền tham trị, giá trị của biến sẽ được sao chép thành một bản sao trong bộ nhớ, việc thực hiện các phép tính toán trong hàm đối với biến này đều thực hiện trên bản sao đã tạo ra.
Kết quả:
Giá trị của biến được truyền hàm vào không thay đổi.
Cách sử dụng:
Không cần thêm ký hiệu gì đặc biệt trước biến được truyền vào hàm cả.
Ví dụ:
#include <stdio.h>
#include <conio.h>
void tangMotDonVi(int a){
a++;
}
int main(){
int n = 2;
tangMotDonVi(n);
printf("%d\n", n); // n vẫn bằng 2
}
Giải thích:
Biến n
được truyền vào hàm tangMotDonVi(int a)
theo cách truyền tham trị, do đó hàm làm việc trên bản sao của n
, cho nên sau khi tăng giá trị của a
trong hàm lên 1, giá trị của biến n
vẫn không thay đổi sau khi kết thúc gọi hàm, n
vẫn bằng 2.
Truyền tham chiếu
Ý tưởng:
Đối với truyền tham chiếu, địa chỉ của biến sẽ được truyền vào hàm, chính vì thế việc thực hiện các phép tính toán trong hàm đối với biến này đều thực hiện trực tiếp trên địa chỉ chứa giá trị của biến đó.
Kết quả:
Giá trị của biến được truyền vào hàm sẽ thay đổi.
Cách sử dụng:
Thêm ký hiệu dấu &
vào trước biến được truyền vào hàm.
Ví dụ:
#include <stdio.h>
#include <conio.h>
void tangMotDonVi(int &a){
a++;
}
int main(){
int n = 2;
tangMotDonVi(n);
printf("%d\n", n); // n sẽ bằng 3
}
Giải thích:
Biến n
được truyền vào hàm tangMotDonVi(int &a)
theo cách truyền tham chiếu, do đó hàm làm việc trực tiếp trên địa chỉ của n
, cho nên sau khi tăng giá trị của a
trong hàm lên 1, giá trị của biến n
vẫn sẽ thay đổi sau khi kết thúc gọi hàm, n
sẽ bằng 3.
Trường hợp sử dụng
Cuối cùng, truyền tham trị được sử dụng trong trường hợp sư huynh không muốn thay đổi giá trị của biến truyền vào, truyền tham chiếu được sử dụng khi sư huynh muốn thay đổi giá trị của biến được truyền vào.
Một ví dụ kinh điển trong sử dụng truyền tham chiếu đó là hàm hoán vị,
#include <stdio.h>
#include <conio.h>
void hoanVi(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 2;
int b = 3;
printf("Truoc khi hoan vi: a = %d, b = %d \n", a, b);
hoanVi(a, b);
printf("Sau khi hoan vi: a = %d, b = %d \n", a, b);
}
Ví dụ trên cho thấy trong một số trường hợp, truyền tham trị không giải quyết được vấn đề, ta cần phải sử dụng truyền tham chiếu. Chỉ có thế thôi, có chỗ nào sai mong hai vị thông báo cho tiểu đệ biết.
Mình cũng đang thắc mắc chỗ này?
Hope someone help.... T.T
– Đỗ Kiệt Đỗ Kiệt 01.12.2017