gpt4 book ai didi

c - 函数指针和函数地址

转载 作者:太空狗 更新时间:2023-10-29 16:19:13 24 4
gpt4 key购买 nike

所以我想在制作函数指针时,您不需要运算符&来获取初始函数的地址:

#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 产生相同的地址,是的,但它们的类型不同。

aint[10] 类型。隐式转换为指针类型时,指针为int*类型,指向数组首元素。 &aint (*)[10] 类型(即指向十个整数数组的指针)。因为数组中不能有填充,它们都产生具有相同的指针,但指针具有不同的类型

函数类似于数组,但又不完全相同。您的函数 foo 的类型为 double(double)。每当 foo 在表达式中使用并且不是一元 & 运算符的操作数时,它会隐式转换为指向自身的指针,类型为 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/9552663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com