Vì vậy, tôi đã tìm khi thực hiện chức năng gợi ý, bạn không cần operator &
để có được địa chỉ của hàm ban đầu Chức năng:con trỏ và địa chỉ của một hàm
#include <stdio.h>
double foo (double x){
return x*x;
}
int main() {
double (*fun1)(double) = &foo;
double (*fun2)(double) = foo;
printf("%f\n",fun1(10));
printf("%f\n",fun2(10));
printf("fun1 = %p \t &foo = %p\n",fun1, &foo);
printf("fun2 = %p \t foo = %p\n",fun2, foo);
int a[10];
printf(" a = %p \n &a = %p \n",a,&a);
return 0;
}
đầu ra:
>./a.out
100.000000
100.000000
fun1 = 0x4004f4 &foo = 0x4004f4
fun2 = 0x4004f4 foo = 0x4004f4
a = 0x7fff26804470
&a = 0x7fff26804470
Sau đó, Tôi nhận ra điều này cũng đúng với các mảng, có nghĩa là nếu bạn có int a[10]
cả hai a
và &a
trỏ đến cùng một vị trí. Tại sao với mảng và chức năng? Địa chỉ được lưu ở vị trí bộ nhớ có cùng địa chỉ với giá trị (địa chỉ) đang được lưu trong đó không?
Tôi chưa bao giờ hiểu rõ lý do tại sao bạn không phải sử dụng toán tử địa chỉ để lấy địa chỉ của hàm. Tôi đã luôn luôn giả định rằng chỉ là một chút đường cú pháp. – Bill
@Bill: Chính xác! Đó là những gì tôi luôn luôn sử dụng để suy nghĩ nhưng có vẻ như bạn không cần phải! – GradGuy
Nếu địa chỉ được lưu trong cùng một vị trí bộ nhớ, thì không thể có dữ liệu mã/mảng chức năng thực tế! Bạn sẽ xử lý thực tế các mảng như con trỏ và các hàm được truyền dưới dạng đối số cũng như con trỏ, vì vậy bạn sẽ không cần toán tử addressof. Về cơ bản, 'giá trị' của một hàm hoặc một mảng là vô nghĩa.Chỉ có địa chỉ có ý nghĩa, vì vậy bạn nhận được rằng khi bạn truy vấn 'giá trị', và cũng có thể khi bạn truy vấn địa chỉ. –