So sánh tham trị và tham biến năm 2024

Trong bài viết này mình sẽ giúp các bạn phân biệt thế nào là tham trị và thế nào là tham chiếu. Ở đây, mình sẽ sử dụng bài toán “Hoán đổi giá trị 2 biến kiểu nguyên” để dễ dàng hơn trong việc giải thích.

Đầu tiên mình sẽ nói về tham trị, ta có đoạn code như sau:

void swap[int a, int b] {

int temp = a; a = b; b = temp; }

main[] { int a = 9, b = 2;

swap[a, b];

printf[“a = %d, b = %d”, a, b];

return 0; }

Kết quả:

Sau khi chạy đoạn code trên, ta thấy giá trị của 2 biến a và b vẫn không thay đổi, skip lại đã! Hãy tiếp tục xem đoạn code sau khi sử dụng tham chiếu:

void swap[int &a, int &b] {

int temp = a; a = b; b = temp; }

main[] { int a = 9, b = 2;

swap[a, b];

printf[“a = %d, b = %d”, a, b];

return 0; }

Kết quả:

Oh, giá trị của 2 biến a,b đã hoán đổi cho nhau, câu hỏi đặt ra ở đây là tại sao khi sử dụng tham chiếu thì giá trị của 2 biến đã khởi tạo bị thay đổi sau khi chạy hàm “swap” còn tham trị thì không? Để khái quát hơn, mời các bạn xem đoạn code nữa:

void swap1[int a, int b] {

int temp = a; a = b; b = temp; printf[“[swap1] address of a is %d”, &a]; }

void swap2[int &a, int &b] { int temp = a; a = b; b = temp; printf[“[swap2] address of a is %d”, &a]; }

main[] { int a = 9, b = 2; printf[“[Main] address of a is %d”, &a];

swap1[a, b]; swap2[a, b];

return 0; }

Kết quả:

Trong đoạn code này, mình sử dụng cùng một lúc cả tham trị [hàm “swap1”] và tham chiếu [hàm “swap2”]. Cùng với đó là in ra địa chỉ của 2 biến a,b tại các thời điểm khác nhau! Các bạn có thể dễ dàng nhận ra rằng sau khi hàm “swap1” [tham trị] chạy thì địa chỉ của biến a đã bị thay đổi nhưng khi hàm “swap2” chạy thì địa chỉ khi in ra lại giống với địa chỉ ban đầu?

Có một sự mâu thuẫn nhẹ ở đây khi so sánh với 2 đoạn code mình đề cập ban đầu: Tham trị: Địa chỉ của biến bị thay đổi >< Giá trị khi in ra vẫn giữ nguyên. Tham chiếu: Địa chỉ của biến giống hệt với ban đầu >< Giá trị khi in ra đã bị hoán đổi.

Kết luận: Để giải quyết được mẫu thuẫn trên, ta bắt buộc phải công nhận một điều là khi dùng tham trị, hàm sẽ tạo một biến mới nào đó, mình gọi nó là a’ và lấy GIÁ TRỊ của biến được truyền vào a, vì thế, mọi thay đổi sẽ được áp dụng lên cái biến a’ đó. Khi kết thúc hàm, biến a’ bị giải phóng, còn biến a vẫn tồn tại và giữ giá trị ban đầu của nó. Còn khi dùng tham chiếu, biến được truyền vào chính xác là biến a, khi đó thay đổi sẽ áp dụng trực tiếp lên biến a, không có một thằng a’ nào được tạo ra cả.

Hi vọng sau đọc bài này các bạn sẽ hiểu rõ hơn về tham trị, tham chiếu để sử dụng nó một cách thật hiệu quả, cám ơn anh Quốc Cường đã giúp mình thực hiện bài viết này!

Chúng Ta thử xem một sự so sánh trong 3 ngôn ngữ C,C++,C# xem có gì khác nhau giữa ba hình thức truyền Tham số cho một hàm:

Ta xét một số khái niệm cơ bản sau:

*Tham Số Hình Thức:Là tham số được khai báo trong phần Danh Sách Các Tham Số trong phần khai báo Hàm.Kiểu dữ liệu của tham số hình thức sẽ quyết định kiểu giá trị cho tham số thực tương tứng,

Ví DỤ: nếu tham số hình thức đựoc khai báo là con trỏ thì tham số thực tương ứng phải là địa chỉ của một biến nguyên hoặc là tên cảu biến mảng: xét một hàm đc khai báo như sau:

function swap[int *a,int *b]

{

//các lệnh

}

thì phần gọi hàm sẽ là swap[&x,&y]

*Tham số thực:Chỉ đến các thông tin được truyền cho hàm trong các lời gọi hàm tương ứng.mỗi tham số thực tương ứng với một tham số hình thức:

Chú Ý:Cần phân biệt truyền theo trị và truyền theo tham biến

-truyền theo trị:khi một tham số được truyền theo trị thì một bản sao giá trị của tham số THỰC được tạo ra và gán cho các tham số hình thức của hàm.vì vậỵ mà mọi thay đổi trong hàm trên bản sao sẽ không ảnh hưởng tới giá trị ban đầu của biến nằm trong hàm gọi .Truyền theo trị được dùng bất cứ khi nào hàm bị gọi không cần thiết thay đổi giá trị BIẾN mà hàm gọi truyền vào tham số cho nó. -Truyền theo tham biến:Khi một hàm được truyền theo tham biến thì hàm gọi sẽ truyền trực tiếp tham số [bắt buộc phải là tham biến]cho hàm đựơc gọi .trong trường hợp này thì tham số hình thức và tham số thực là một .Truyền theo thambiến chỉ nên dùng khi hàm bị gọi thực sự cần thiết thay đổi giá trị của biến truyền vào cho nó

Ví Dụ:

Đối với ngôn ngữ C:có 2 hình thức truyền tham số: + tham số được truyền theo trị +tham số được truyền theo con trỏ:

/*Swap1.c */

include

include

//khai bao va dinh nghia prototype

void swap[int a,int b]

{

int temp;//bien trung gian

temp=a;

a=b;

b=temp;

}

void main[]

{

int x=3,y=4;

printf["\Truoc khi goi ham swap[]\n"];

printf["%3d %3d",x,y];

// goi ham swap

swap[]x,y];

printf["sau khi goi ham swap\n"];

printf["%3d %3d ",x,y];

getch[];

}

ket qua Truoc khi goi swap 3 4 Sau khi goi swap 3 4

/*Swap2.c*/

/*tham số hình thức là một con trỏ*/

include

include

//khai bao va dinh nghia prototype

void swap[int *a,int *b]

{

int temp;

temp=*a;

*a=*b;

*b=temp;

}

//ham main

void main[]

{

int x=3,y=4;

printf["Truoc khi goi ham swap[]\n"];

printf["%3d %3d ",x,y];

printf["Sau Khi goi ham swap[]\n"];

swap[&x,&y];

printf["%3d %3d",x,y];

getch[];

}

Ket Qua Truoc Khi GOi Ham Swap 3 4 Sau Khi Goi Ham Swap 4 3

Tóm Lại trong C để lấy đc giá trị thay đổi thì nên truyền theo con trỏ

Trong C++:

Trong c++ ngoài 2 cách truyền như trên C++ còn đưa thêm một kiểu truyền nữa là truyền theo tham chiếu

vậy tham chiếu là gi?

ta xét ví dụ sau:Nguyễn Sinh Cung là tên gốc của BÁc Hồ.Như vậy khi cùng nói về nguyễn Sinh Cung có ngưòi thì không gọi tên gốc mà có thể gọi là HỒ CHÍ MINH,hay Nguyễn văn Ba,hay Nguyễn Ái Quốc,..Như vậy dù gọi theo cách nào thì mọi người vẫn hiểu đó là ngụyễn sinh cung, Như Vậy cách gọi :Nguyễn Ái Quốc,Nguyễn Sinh CUng,...đóng vai trò là tham chiếu tức là cùng tham chiếu đến cùng một đối tượng cụ thể[ở đây là bác hồ] trong C++ để tham chiếu đến một biến thì khai báo như sau:

int n;

int &p=n;

include

include

//ham swap1[] được gọi với tham số được truỳên theo trị

void swap1[int a,int b]

{

int temp;

temp=a;

a=b;

b=temp;

}

//hám swap2[] được thực hiên với tham số được truyền bằng tham trỏ

void swap2[int *a,int *b]

{

int temp;

temp=*a;

*a=*b;

*b=*a;

}

//hàm swap3[] được thực hiện với việc truyền tham chiếu

void swap3[int &a,int &b]

{

int temp;

temp=a;

a=b;

b=temp;

}

//ham main

void main[]

{

int x=3 ,y=4;

//ham swap1

cout

Chủ Đề