Tham số (lập trình máy tính)

Trong lập trình, **tham số** là biến được thu nhận bởi một chương trình con. Tại thời gian chạy, chương trình con sử dụng các giá trị được gán cho các tham số để thay đổi cách ứng xử của mình. Hầu hết các ngôn ngữ lập trình có thể định nghĩa các chương trình con không có tham số hoặc chấp nhận một vài tham số.

## Tham số hình thức và tham số thực sự
**Tham số hình thức** là biến được liệt kê trong danh sách tham số (thường nằm tại phần đầu của định nghĩa chương trình con). Còn **tham số thực sự** là giá trị cụ thể của biến đó tại thời gian chạy.

Để phân biệt rõ hai khái niệm trên, xét ví dụ dưới đây (viết bằng C):

```
int sum(int addend_1, int addend_2)
 {
    return (addend_1 + addend_2);
 }
```

Hàm `sum` nhận hai *tham số hình thức*: `addend_1` và `addend_2`. Nó lấy tổng của các giá trị được truyền vào các tham số này và trả về kết quả cho nơi gọi hàm (bằng cách sử dụng một kỹ thuật được cung cấp tự động bởi trình biên dịch C).
Mã gọi hàm `sum` có thể trông như dưới đây:

```
int sumValue;
 int value_1 = 40;
 int value_2 = 2;

 sumValue = sum(value1, value2);;
```


Các biến `value_1` và `value_2` được khởi tạo với các giá trị 40 và 2. Các biến này không phải *tham số hình thức* hay *tham số thực sự*.
Tại thời gian chạy, giá trị đã được gán cho các biến này được truyền vào cho hàm `sum`. Trong hàm `sum`, các tham số hình thức `addend_1` và `addend_2` được tính giá trị và lần lượt cho kết quả là hai *tham số thực sự* **40** và **2**. Giá trị của các *tham số thực sự* được cộng lại, kết quả được trả về cho nơi gọi hàm - nơi nó được gán cho biến `sumValue`.

*Tham số hình thức* thường được gọi tắt là **tham số**. *Tham số thực sự* còn được gọi là **tham số thực**, **tham đối** hoặc **đối số**.

## Truyền tham số

Cơ chế chính xác cho việc gán đối số cho một tham số, được gọi là *cơ chế truyền tham số*, phụ thuộc vào chiến lược đánh giá được sử dụng cho tham số đó (thông thường là truyền giá trị (*call-by-value*)). Lập trình viên có thể dùng các từ khóa để đánh dấu chiến lược được lựa chọn cho từng tham số.

### Truyền bằng giá trị
Trong cơ chế truyền tham số bằng giá trị (gọi tắt là *truyền trị*), khi chương trình con được chạy, một bản sao của tham số thực sự được gán cho tham số hình thức (sao chép giá trị). Nghĩa là mọi sửa đổi của chương trình con đối với tham số hình thức không gây ảnh hưởng tới biến được truyền vào chương trình con theo kiểu truyền tham trị.

Các tham số được truyền bằng giá trị được gọi là **tham trị**. 
Do chỉ có giá trị được truyền vào chương trình con, tham số thực sự không nhất thiết phải là một biến thông thường mà có thể là hằng giá trị, hằng biến, biểu thức trả về giá trị,...

### Truyền bằng biến
Trong cơ chế truyền tham số bằng biến (gọi tắt là *truyền biến*), khi chương trình con được chạy, tham số hình thức trở thành một tham chiếu tham số thực sự. Nghĩa là mọi sửa đổi của chương trình con đối với tham số hình thức sẽ có tác dụng với tham số thực sự. Đây được gọi là *hiệu ứng phụ của chương trình con*.

Các tham số được truyền bằng biến được gọi là **tham biến**. 
Ngược lại với cơ chế truyền bằng giá trị, cơ chế truyền bằng biến đòi hỏi tham số thực sự phải là một biến.

### Các đối số mặc định
Một số ngôn ngữ lập trình cho phép một đối số mặc định (*default argument*) được cho trước một cách tường mình hay ngầm định trong phần khai báo của một chương trình con. Điều này cho phép nơi gọi bỏ qua đối số này khi gọi chương trình con đó. Nếu đối số mặc định được cho một cách tường mình, thì giá trị đó được sử dụng mỗi khi nó không được cung cấp bởi nơi gọi. Nếu đối số mặc định là ngầm định (mà đôi khi được khai báo bởi từ khóa như là "Optional" (*không bắt buộc*)) thì ngôn ngữ sẽ cung ứng một giá trị "ban đầu" thông dụng (như là *[[null]]*, tập rỗng, giá trị 0, xâu ký tự rỗng,...) nếu giá trị (của tham số) không được nơi gọi cung cấp.

### [[Chiều dài]] biến đổi được của danh sách tham số
Một số ngôn ngữ cho phép các chương trình con được định nghĩa với số các đối số thay đổi được. Đối với các ngôn ngữ như vậy, các chương trình con phải duyệt qua danh mục của các đối số

### Các tham số danh định

Một số ngôn ngữ lập trình cho phép các chương trình con có các tham số danh định (*named parameter*). Điều này cho phép mã nơi gọi chương trình con có tính tự mô tả (self-documenting) cao hơn. Nó cũng cung cấp cho nơi gọi khả năng uyển chuyển cao hơn, thường cho phép thay đổi thứ tự của các đối số hay bỏ qua một số đối số nếu cần thiết.

## Tham khảo