c - 函数指针和函数地址

标签 c function pointers function-pointers

所以我认为在创建函数指针时,不需要运算符 & 来获取初始函数的地址:

#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/

相关文章:

c - 内存泄漏释放 g_strdup

javascript - 有没有更好的方法来使用reduce测试n个函数? [JS]

c - 为什么我得到 : "error: assignment to expression with array type"

c - 指向字符串数组的字符串参数?

pointers - 在 Golang 中将接口(interface)设置为 nil

CreateFile 打开 lsass.exe 失败

c - 如何获得安装的内存大小?

C 中的 char[] 操作

python - 通过字典访问函数

javascript - 为什么在 Google Script 中由时间驱动的触发器执行时函数参数的值不是未定义的?