Trong một vài trường hợp, bạn có thể gặp tình huống khi bạn muốn có một hàm mà có thể lấy số lượng đối số thay đổi các tham số, thay vì số lượng tham số được xác định trước. Tham số biến trong C cung cấp một giải pháp cho tình huống này và cho phép định nghĩa một hàm có thể nhận số lượng biến số, tham số dựa trên yêu cầu của bạn. Ví dụ sau đây cho thấy định nghĩa của một hàm như vậy.
int func(int, ... ) {
.
.
.
}
int main() {
func(1, 2, 3);
func(1, 2, 3, 4);
}
Cần lưu ý rằng hàm func () có đối số cuối cùng của nó là các dấu ba chấm, tức là ba dấu chấm ( ... ) và một dấu chấm ngay trước dấu ba chấm luôn là một int sẽ đại diện cho tổng số đối số biến được truyền. Để sử dụng chức năng như vậy, bạn cần sử dụng tệp tiêu đề stdarg.h để cung cấp các hàm và macro để thực hiện chức năng của đối số biến và làm theo các bước đã cho.
Xác định hàm có tham số cuối cùng của nó dưới dạng dấu ba chấm và một tham số ngay trước dấu ba chấm luôn là một int sẽ đại diện cho số đối số.
Tạo biến kiểu va_list trong định nghĩa hàm. Kiểu này được định nghĩa trong tệp tiêu đề stdarg.h.
Sử dụng tham số int và va_start macro để khởi tạo biến va_list vào danh sách đối số. Macro va_start được định nghĩa trong tệp tiêu đề stdarg.h.
Sử dụng biến va_arg macro và va_list để truy cập từng mục trong danh sách đối số.
Sử dụng macro va_end để dọn bộ nhớ được gán cho biến va_list .
Bây giờ, chúng ta hãy làm theo các bước trên và viết ra một hàm đơn giản có thể lấy số lượng tham số biến và trả về giá trị trung bình của chúng.
#include
#include
double average(int num,...) {
va_list valist;
double sum = 0.0;
int i;
/* initialize valist for num number of arguments */
va_start(valist, num);
/* access all the arguments assigned to valist */
for (i = 0; i < num; i++) {
sum += va_arg(valist, int);
}
/* clean memory reserved for valist */
va_end(valist);
return sum/num;
}
int main() {
printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau. Cần lưu ý rằng hàm trung bình () đã được gọi hai lần và mỗi lần đối số đầu tiên biểu thị tổng số đối số biến được truyền. Chỉ các dấu ba chấm sẽ được sử dụng để chuyển số lượng đối số biến.
Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
Tài liệu về lập trình C liên quan khác: