所以我认为在创建函数指针时,不需要运算符 &
来获取初始函数的地址:
#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;
}
输出:
>./a.out
100.000000
100.000000
fun1 = 0x4004f4 &foo = 0x4004f4
fun2 = 0x4004f4 foo = 0x4004f4
a = 0x7fff26804470
&a = 0x7fff26804470
然后我意识到这对于数组也是如此,这意味着如果你有 int a[10]
,a
和 &a
都指向相同的位置。为什么是数组和函数呢?保存在内存位置中的地址是否与保存在其中的值(地址)具有相同的地址?
最佳答案
给定 int a[10]
,a
和 &a
都会产生相同的地址,是的,但它们的类型不同。
a
的类型为 int[10]
。当隐式转换为指针类型时,指针的类型为int*
,并指向数组的初始元素。 &a
的类型为 int (*)[10]
(即指向包含 10 个整数的数组的指针)。由于数组中不能有填充,因此它们都会产生具有相同值的指针,但指针具有不同的类型。
函数与数组类似,但并不完全相同。您的函数 foo
的类型为 double(double)
。每当在表达式中使用 foo
并且不是一元 &
运算符的操作数时,它就会隐式转换为指向自身的指针,其类型为 double (*)( double )
.
因此,出于所有实际目的,函数的名称和指向同一函数的指针是可以互换的。有一些微妙之处,我在 "Why do all these crazy function pointer definitions all work? What is really going on?" 的回答中讨论了所有这些。 (这个问题是关于 C++ 的,但 C++ 中非成员函数的规则与 C 中函数的规则相同。)
关于c - 函数指针和函数地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40337845/