1
Điểm khác nhau giữa truyền tham chiếu và truyền tham trị trong C/C++?
2
dinhsang20 đã đăng:

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 ạ?

Mình cũng đang thắc mắc chỗ này?

Hope someone help.... T.T

Đỗ Kiệt 01.12.2017
thêm bình luận...
4
Zootopia60 đã đă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ị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, nsẽ 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.

đã bổ sung 6.5 năm trước bởi
Zootopia60
Không lòng vòng anh như Hải Phòng
1

Cảm ơn vị tiểu huynh đệ đây.

Đỗ Kiệt 01.12.2017

Trong C không được dùng:

int hoanVi(int &a, int &b)

Mà phải dùng con trỏ:

int hoanVi(int *a , int *b)
Cộng đồng 09.03.2019

Tại sao vậy?

Phương 1996 09.03.2019
2

Được dùng hết mà, hoanvi(int &a, int &b) thì khi dùng ta truyền vào là hoanvi(a, b) với a, b là các giá trị còn hoanvi(int *a, int *b) thì khi truyền vào ta truyền địa chỉ của giá trị hoanvi(&a, &b).

Cộng đồng 08.11.2019

Hay, +1 cho câu bình luận của bạn, hoán vị đầu sử dụng tham chiếu mà bản chất của tham chiếu đã là địa chỉ của biến cho nên không cần truyền vào dấu&, còn cách hoán vị thứ hai sử dụng con trỏ, bản chất con trỏ là lưu địa chỉ của biến khác cho nên khi truyền biến khác vào phải sử dụng dấu &, không biết mình nghĩ như vậy có đúng không?

Cộng đồng 09.11.2019
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)