为了账号安全,请及时绑定邮箱和手机立即绑定

函数指针和函数的地址

函数指针和函数的地址

C
慕尼黑的夜晚无繁华 2019-08-26 19:24:35
函数指针和函数的地址所以我想在制作函数指针时,你不需要operator &获取初始函数的地址:#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.000000100.000000fun1 = 0x4004f4      &foo = 0x4004f4fun2 = 0x4004f4       foo = 0x4004f4   a = 0x7fff26804470   &a = 0x7fff26804470然后我意识到这对于数组也是如此,这意味着如果你有int a[10]两个a并&a指向相同的位置。为什么这是数组和函数?地址是否保存在与其中保存的值(地址)具有相同地址的内存位置中?
查看完整描述

3 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

鉴于int a[10],双方a&a产生相同的地址,是的,但它们的类型是不同的。

a是类型的int[10]。当它被隐式转换为指针类型时,指针是类型int*并指向数组的初始元素。&a是类型int (*)[10](即指向十个整数数组的指针)。因为数组中没有填充,它们都会产生具有相同的指针,但指针具有不同的类型

函数类似于数组,但不完全相同。你的功能foo是类型的double(double)。无论何时foo在表达式中使用并且不是一元运算&符的操作数,它都会隐式转换为指向其自身的指针,该指针属于类型double(*)(double)

因此,出于所有实际目的,函数的名称和指向同一函数的指针是可互换的。有一些细微之处,我在回答“为什么所有这些疯狂的函数指针定义都能正常工作?真正发生了什么?”时回答了所有这些细微之处(这个问题是关于C ++的问题,但C ++中非成员函数的规则与C中的函数相同。)


查看完整回答
反对 回复 2019-08-26
?
开满天机

TA贡献1786条经验 获得超13个赞

不,没有专门用于指向函数/数组的额外存储空间。

大多数变量variable_name除了获取该变量的地址之外还有其他含义,因此您需要使用它&variable来获取地址。

对于函数或数组,function_name(本身,后面没有括号)没有任何其他含义,因此将它解释为获取函数的地址没有问题。

同样反过来:普通指针需要显式解除引用,但指向函数的指针不会(再次,因为没有其他合理的解释),所以给定一个指向函数的指针,如:

int (*func)(param_list);

以下是彼此相同的 - 都调用任何功能func点:

(*func)(params);func(params);


查看完整回答
反对 回复 2019-08-26
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

基本上,由于函数名称是“已知”的函数,因此&并非绝对必要。对于数组,此行为是相同的。回想一下,函数本身不是变量,因此它的行为与您有时可能会有的不同。如果你有第二版K&R,你可以查看5.11节关于功能的指示,或者最后的参考手册,

A7.1节指针生成:如果某个类型T的表达式或子表达式的类型是“T的数组”,那么表达式的值是指向数组中第一个对象的指针,表达式的类型是改为“指向T” 这种转换不会取代表达式是一元&运算符的操作数,...类似地,类型为“函数返回T”的表达式除非用作&运算符的操作数,否则将转换为“指针函数返回T.“

A7.4.2节地址运算符:一元&运算符获取其操作数的地址....结果是指向左值引用的对象或函数的指针。如果操作数的类型是T,则结果的类型是“指向T的指针”。

据我所知,C99也是如此。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 510 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信