Trong khi nghe qua khóa học Programming Abstractions của Stanford, tôi bắt gặp một đoạn mã trông giống như sau.chức năng như tham số vs con trỏ hàm như tham số
void plot(double start, double end, double (fn)(double)) {
double i;
for (i = start; i <= end; i += 1)
printf("fn(%f) = %f\n", i, fn(i));
}
double plus1(double x) {
return x + 1;
}
int main(void) {
plot(1, 10, plus1);
return 0;
}
Tôi đã biên dịch mã trên hệ thống của mình bằng GCC, sau đó là G ++; cả hai đều chạy hoàn hảo.
Tôi biết rằng đi qua một int i = 2
vào một chức năng như void func1(int a)
sẽ tạo một bản sao mới của i
đó cho chức năng đó trong khi đi &i
để void func2(int *a)
sẽ chỉ cung cấp cho các chức năng func2
địa chỉ của i
.
Vì vậy, bất cứ ai cũng có thể giải thích cho tôi cơ chế để vượt qua fn
đến plot
và cách nó khác với truyền con trỏ hàm làm tham số?
Bạn có một tài liệu tham khảo cho tuyên bố thứ hai của bạn liên quan đến mảng? Đặc biệt khi đó là C++? – krlmlr
Có một chút khác biệt, trước đây, 'fn' được ngụ ý là một con trỏ trỏ đến hàm, và trong' fn' sau đó được khai báo một cách rõ ràng đến hàm –
@ user946850: '§8.3.5/5': ... Sau xác định loại của mỗi tham số, bất kỳ tham số nào của kiểu “mảng T” hoặc “hàm trả về T” được điều chỉnh là “con trỏ đến T” hoặc “con trỏ tới hàm trả về T” tương ứng. ... – Mankarse