关于函数指针的问题???指针解除引用和没有接触引用结果是一样的???why???程序可直接运行

yongyuandeguodong 2009-04-08 10:15:45
我的问题写在注释了,大牛解释下撒,谢了

#include <iostream>
using namespace std;
double squared(double);
double cubed(double);
double sum_arry(double arry[],int len,double (*pfun) (double));
int main()
{
double arry[]={1.5,2.5,3.5};
int len=sizeof arry/sizeof arry[0];
cout<<"Squared:"<<sum_arry(arry,len,squared)<<endl;
cout<<"Cubed:"<<sum_arry(arry,len,cubed)<<endl;
return 0;
}

double squared(double x)
{
return x*x;
}

double cubed(double x)
{
return x*x*x;
}

double sum_arry(double arry[],int len, double (*pfun) (double))
{
double total=0;
for(int i=0;i<len;++i)
total+=(*pfun)(arry[i]); //我想强调这里,为什么(*pfun)和pfun的效果一样???
return total;
}
...全文
238 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouzhf 2009-04-10
  • 打赏
  • 举报
回复
楼主可以看看《彻底搞定c指针》这书,后面讲的蛮清楚的!
ForestDB 2009-04-10
  • 打赏
  • 举报
回复
void foo();
对于函数,&foo,foo,*foo都是一样的,三位一体。
hzx716 2009-04-09
  • 打赏
  • 举报
回复
嗯,函数名就是函数的入口
yongyuandeguodong 2009-04-09
  • 打赏
  • 举报
回复
呵呵,我明白了,谢谢你
  • 打赏
  • 举报
回复
total+=(*pfun)(arry[i]); //我想强调这里,为什么(*pfun)和pfun的效果一样???

函数名在普通情况下,跟该名字的指针等效的。
snk0826027 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 snk0826027 的回复:]
显然C语言的设计者采取了后者.
[/Quote]
C语言中就是如此, 在没有修改必要的情况下, C++的设计者也采取了这个设计决策.
snk0826027 2009-04-08
  • 打赏
  • 举报
回复
取 func 这个标识符的地址可以说是没有意义的, 因为这个标识符代表的是一个函数的入口地址, 在编译后应该被编译器替换成地址值.
就像 &0x11111111H 是没有意义的一样. 但是在操作指针的时候有大量的 & 操作, 为了避免语义上的冲突, 设计者可以选择禁止对函数名, 数组名进行 & 操作, 也可以让此时的特殊&操作变成无任何操作, 显然C语言的设计者采取了后者.
deerwin1986 2009-04-08
  • 打赏
  • 举报
回复
两者一样的...规定如此 函数名就是指针 就好象数组名在很多情况下可以退化为指针一样...
LZ不要再深究了吧 除非看 C++的演化与发展 吧...
snk0826027 2009-04-08
  • 打赏
  • 举报
回复
函数指针是比较特殊的. 在表达式中函数名得到的就是函数的地址, 这也是为什么可以把一个函数名赋值给一个函数指针的原因. 也就是说,函数名就跟数组名一样, 本身在表达式中是地址, 而不是值. 具体的可以参考函数指针的定义.
double (*pfun) (double) = func; 而不需要 = &func; 因为&func 如果按照普通变量地址来解释, 语义上是行不通的, 所以标准规定 func == &func; 对函数指针进行调用的时候也就 *pfun() == pfun() 了.
brookmill 2009-04-08
  • 打赏
  • 举报
回复
函数名本身就是一个地址

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧