Phân biệt tham chiếu và tham trị trong C++

Related Articles

Đã học về hàm thì chúng ta cần phải nắm rõ khái niệm tham chiếu tham trị. Đây là 2 cách truyền tham số vào hàm khác nhau. Do đó, tùy mục đích mà chúng ta sẽ truyền tham số bằng tham trị hoặc tham chiếu. Trong bài học này, Lập trình không khó sẽ cùng bạn đi làm sáng tỏ 2 khái niệm này qua các bài tập thực hành nhé.

Lưu ý: Tham chiếu trong bài này là kiến thức của C++. Còn với ngôn ngữ C, nếu muốn truyền tham chiếu thì bạn cần đọc tham chiếu trong C sau khi học con trỏ.

Tham Chiếu Và Tham Trị

Video hướng dẫn tham chiếu và tham trị

Source code trong video hướng dẫn về tham trị và tham chiếu:

0123456789101112131415161718192021222324252627282930313233343536

/ *

truyền tham trị ( giá trị ) : pass by value

truyền tham chiếu : pass by reference

* /

/ *

Viết hàm hoán vị 2 số

* /

#include

voidSwap(intvà a, int và b ) {

int tmp = a ;

a=b;

b=tmp;

}

voidincrement(intvà n ) {

n + + ;

}

intmain(){

intfirst,second;

printf(” nNhap first = “);scanf(” % d “,và first ) ;

printf(” nNhap second = “);scanf(” % d “,và second ) ;

printf(” nfirst = % d, second = % d “,first,second);

increment(first);

increment(second);

Swap(first,second);

printf(” nfirst = % d, second = % d “,first,second);

}

Kết quả chạy chương trình :

0123456789 PS G : c_cources day_33 >. ValueVsReff. exeNhap first = 4Nhap second = 5first = 4, second = 5first = 5, second = 4

Làm rõ tham trị và tham chiếu

Bạn đọc cần đọc tích hợp cả tham chiếu và tham trị để thuận tiện phân biệt 2 khái niệm này, cũng như cách dùng và khi nào cần dùng .

Tham chiếu là gì?

  • Khai báo hàm sử dụng tham số dưới dạng tham chiếu bằng cách thêm dấu & vào trước tham số đó, Ví dụ: int f(int &x){}.
  • Khi một biến a được truyền vào lời gọi hàm f(int &x) làm tham số dưới dạng tham chiếu, thì biến x của hàm f(int &x) và biến a thực chất là một. Do đó, nếu hàm mà thay đổi giá trị của x trong hàm f(int &x) này thì đồng nghĩa tại nơi gọi hàm biến a cũng bị thay đổi theo.
  • Nếu tham số là mảng hoặc chuỗi, thì tham số này được truyền theo tham chiếu.

Tham trị là gì?

  • Chúng ta vẫn thường dùng hàm trong hầu hết các bài học trước và truyền tham số theo cách truyền theo tham trị. Ví dụ: int f(int x){}.
  • Khi một biến a được truyền vào lời gọi hàm f(int x) làm tham số dưới dạng tham trị, thì biến x của hàm f(int x) và biến a là hai biến độc lập. Bởi vì khi tham số của hàm f(int x) là tham trị, hàm này sẽ tạo ra một biến mới và sao chép giá trị của a vào. Do đó, nếu hàm mà thay đổi giá trị của x trong hàm f(int x) này thì không tác động gì tới giá trị của biến a.

Ví dụ về tham chiếu và tham trị trong C++

Ở ví dụ này, chúng ta sẽ cùng nhau đi viết 1 hàm kiểu void nhận vào 1 biến số nguyên và thân hàm có nhiệm vụ tăng giá trị tham số đó lên 1 đơn vị.

Khi hàm của tất cả chúng ta nhận tham số dưới dạng tham trị :

012345678910111213141516

#include

voidPassByValue

(

intn){

n++;/ / Tăng n lên 1 đơn vị chức năng

printf(” nDia chi cua n : % d “,và n ) ;/ / Lấy địa chỉ của biến

}

intmain(){

intvalue;

printf(” nNhap value = “);scanf(” % d “,và value ) ;

printf(” nDia chi cua n : % d “,và value ) ;/ / Lấy địa chỉ của biến

printf(” nTruoc khi goi ham value = % d “,value);

PassByValue(value);

printf(” nSau khi goi ham value = % d “,value);

}

Kết quả chạy :

012345678910 PS G : c_cources day_33 > g + +. ValueVsRef. cpp – o. ValueVsRefPS G : c_cources day_33 >. ValueVsRef. exeNhap value = 5Dia chi cua n : 6487580Truoc khi goi ham value = 5Dia chi cua n : 6487536Sau khi goi ham value = 5

Như bạn thấy, khi hàm được truyền theo tham trị thì :

  • Giá trị của biến value trong hàm main không bị thay đổi.
  • Địa chỉ của value trong hàm main và địa chỉ của n trong hàm PassByValue là khác nhau.

Khi hàm của tất cả chúng ta nhận tham số dưới dạng tham chiếu :

012345678910111213141516

#include

voidPassByReference(intvà n ) { / / Truyền theo tham chiếu

n + + ;/ / Tăng n lên 1 đơn vị chức năng

printf(” nDia chi cua n : % d “,và n ) ;/ / Lấy địa chỉ của biến

}

intmain(){

intvalue;

printf(” nNhap value = “);scanf(” % d “,và value ) ;

printf(” nDia chi cua n : % d “,và value ) ;/ / Lấy địa chỉ của biến

printf(” nTruoc khi goi ham value = % d “,value);

PassByReference(value);

printf(” nSau khi goi ham value = % d “,value);

}

Kết quả chạy chương trình :

012345678910 PS G : c_cources day_33 > g + +. ValueVsRef. cpp – o. ValueVsRefPS G : c_cources day_33 >. ValueVsRef. exeNhap value = 5Dia chi cua n : 6487580Truoc khi goi ham value = 5Dia chi cua n : 6487580

Sau khi goi ham value = 6

Như bạn thấy, khi hàm nhận tham số là tham chiếu thì :

  • Giá trị của biến value trong hàm main bị thay đổi đúng theo cách biến n bị thay đổi trong hàm PassByReference.
  • Địa chỉ của value trong hàm main và địa chỉ của n trong hàm PassByReference là giống nhau => chúng cùng là 1 biến.

Kết luận về tham chiếu và tham trị trong C++

Qua bài học kinh nghiệm và những ví dụ mình đã trình diễn ở trên, mình có 1 số tóm tắt về tham chiếu và tham trị như sau :

  • Dùng tham trị khi bạn không muốn giá trị của biến bị thay đổi.
  • Dùng tham chiếu khi bạn muốn hàm thay đổi giá trị biến của bạn.
  • Dùng tham chiếu sẽ tiết kiệm bộ nhớ hơn, vì nó không phải tạo ra 1 bản sao.
  • Nếu bạn dùng tham chiếu, bạn cũng không muốn hàm thay đổi giá trị của bạn thì bạn cần thêm từ khóa const vào tham số đó. Ví dụ: int f(const int &x).
  • Nếu tham số là mảng => truyền theo tham chiếu. Chúng ta sẽ tìm hiểu nó trong chương sau.

More on this topic

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Advertismentspot_img

Popular stories