Ý nghĩa tham số, tham trị, tham biến

a. tham số: các biến truyền vào hàm
b. tham trị: giá trị của tham số
c. tham biến: tham số dưới dạng tham chiếu

a.
int a = 4;
Print(a);

b.
int b = 4;
Print(b);

c.
int c;
Print(&c);

Giả sử tôi có 1 module tên mà làm việc theo nguyên tắc cần số liệu vào ( tham trị ) và cho kết quả

ví dụ :

+ Như là công việc kiểm tra hợp đồng (module ) cần 1 tờ giấy báo cáo ( tham số) có những thông tin (tham trị)
+Ví dụ tôi có hàm tính căn bậc 2, với y=8 , x= căn bậc 2 của (y)
ta có y là tham số , 8 là tham trị ,
và sau khi gọi hàm thì giá trị của y , bản hợp đồng vẫn thế ko có gì thay đổi

tham biến :

ví dụ

module : sửa bản hợp đồng
tham biến : 1 bản hợp đồng nào đó
Sau khi thực hiện mudule trên thì bản hợp đồng sẽ thay đổi.

tăng biến x lên 1 :
module : ++
tham biến : x
Sau khi thực hiện mudule trên thì x sẽ thay đổi.

trực quan sinh động đến tư duy trừu tượng :

1 hàm sử dụng tham số có ý nghĩa là hàm đó chỉ lấy giá trị nằm trong biến đó thôi, chứ bản thân hàm biến đó ko phải là đối tượng của hàm. Cái đối tượng đem ra xử lý của hàm là giá trị nằm trong đó.
hàm tính căn bậc 2 : cái nó quan tâm ở đây là căn bậc 2 của mấy , số là đối tượng được quan tâm tơi.
khi tính căn bậc 2 của x: thì x là tham số, giá trị nằm trong x là tham trị

Hàm sử dụng tham chiếu là hàm làm việc trực tiếp với biến đó, đối tượng được truyền vào ko phải là giá trị mà chính là địa chỉ của biến đó nằm trong bộ nhớ sẽ giúp cho hàm này có khả năng thay đổi biến đó
ví dụ hàm chuẩn hóa 1 xâu :
thì : cái cần chuẩn hóa là gì , xâu, ví dụ char p[]="hêllô aa" thì p chính là đối tượng được quan tâm chứ ko phải là chuỗi "hêllô aa" , sau khhi chuẩn hóa thì nội dung trong p sẽ bị thay đổi

Điểm Khác Nhau Giữa Truyền Tham Số,Truyền Tham Trị và Truyền Tham Số Đầu Ra

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<conio.h>
#include<stdio.h>
//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<conio.h>
#include<stdio.h>
//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<conio.h>
#include<iostream.h>
//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<<"Truoc Khi GOi ham swap1():\n"
cout<<"a="<<a<<" b="<<b<<"\n";
swap1(x,y);
cont<<"Sau Khi Goi ham swap2():\n"
cout<<"a="<<a<<"b= "<<b<<"\n"

//ham swap2
cout<<"Truoc Khi GOi ham swap2():\n"
cout<<"a="<<a<<" b="<<b<<"\n";
swap2(x,y);
cont<<"Sau Khi Goi ham swap2():\n"
cout<<"a="<<a<<"b= "<<b<<"\n"

//ham swap3
cout<<"Truoc Khi GOi ham swap3():\n"
cout<<"a="<<a<<" b="<<b<<"\n";
swap3(x,y);
cont<<"Sau Khi Goi ham swap3():\n"
cout<<"a="<<a<<"b= "<<b<<"\n"
getch();
}

Ket Qua
Truoc Khi GOi ham Swap1()
x=3 y=4
sau  khi hoi ham swap1()
x=3 y=4
Truoc Khi GOi ham Swap2()
x=3 y=4
sau  khi hoi ham swap2()
x=4 y=3
Truoc Khi GOi ham Swap3()
x=3 y=4
sau  khi hoi ham swap3()
x=4 y=3

Túm Lại Trong C++ có 3 cách truyền
+truyền theo tham trị
+truyền theo tham trỏ
+truyền theo tham chiếu(reference)

Trong C#

trong C# chúng ta sẽ làm quen với khái niệm là Class và Ọbject ,mình sẽ không nhắc lại .nếu ai quên thì giở sách cuả bác Dương Quang Thiện ra xem lại

Trong C# cũng có 3 cách truyền vào cho một phương thức

+truyền theo Tham trị:Khi Tham số có kiểu dữ liệu là giá trị thì sẽ được truyền vào cho phương thức kiểu giá trị .điều này có nghĩa là khi một đối tượng(trong C chính là các biến ) có kiểu giá trị được truyền vào một phương thức thì sẽ có một bản sao của đối tượng đó sẽ được tạo ra bên trong phương thức.khi phương thức này kết thúc thì bản sao này cũng bị huỷ,cách dùng đối với trường hợp này giống với cách dùng trong C/C++
+Truyền theo tham chiếu:Một phương thức chỉ có thể trả về duy nhất một giá trị ,trong trường hợp muốn nhận nhiều hơn một kết qủa thì ta cách thực hiện là tạo các tham số dưới hình thức là các tham chiếu.khi đó ta sẽ sử dụng từ khoá ref
+truyền theo tham chiếu với biến chưa khởi tạo:trong C# bắt buộc phải thực hiện việc gán giá trị cho biến trước khi sử dụng.do vậy khi khai báo một biến kiểu cơ bản nào đấy thì trứơc khi có lênh nào đó sử dụng biến này thì bắt buộc phải gán giá trị cho biến đó

Như vậy để không phải khởi tạo tham số trước khi dùng thì C# cung cấp thêm một từ khoá out

Chú ý: bên trong phương thức chứa tham số tham chiếu out thì các tham số này phải được gán giá trị trứoc khi trở về: