关于函数指针

isaxu 2003-01-23 03:18:35
#include<stdafx.h>
#include<iostream.h>
#include<math.h>

/* 没有函数的指针
double sigma(double(func)(double),double db,double de)
{
double dt=0.0;
for(double d=db;d<de;d+=0.1)
dt += func(d);
return dt;
}

void main()
{
double dsum;
dsum=sigma(sin,0.1,1.0);
cout<<"the sum of sin from 0.1 to 1.0 is "<<dsum<<endl;
dsum=sigma(cos,0.5,3.0);
cout<<"the sum of cos from 0.5 to 3.0 is "<<dsum<<endl;
}
*/

/*有函数的指针*/
double sigma(double(*func)(double),double db,double de)
{
double dt=0.0;
for(double d=db;d<de;d+=0.1)
dt += func(d);
return dt;
}

void main()
{
double dsum;
dsum=sigma(sin,0.1,1.0);
cout<<"the sum of sin from 0.1 to 1.0 is "<<dsum<<endl;
dsum=sigma(cos,0.5,3.0);
cout<<"the sum of cos from 0.5 to 3.0 is "<<dsum<<endl;
}


double sigma(double(func)(double),double db,double de)
double sigma(double(*func)(double),double db,double de)
这两个程序表面的区别是多了一个 *
但是我知道执行的机制肯定是不一样的,但具体是怎样的我很迷惑,请高手指点!:)
...全文
61 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinajiji 2003-01-24
  • 打赏
  • 举报
回复
double sigma(double(func)(double),double db,double de)

double sigma(double(*func)(double),double db,double de)
是完全等价的两种形式,
也等同于:
double sigma(double func(double),double db,double de)

因为在C语言中不可能在函数形参中定义一个函数,(有的语言可以在函数的形参中定义另外一个函数) 所以sigma函数的第一个参数:double(func)(double),不是在定义一个函数,编译器知道你不可能在一个函数的形参中定义一个新的函数,所以它自动将double(func)(double),转换为这样的形式:double(*func)(double),

另外:函数指针的调用也有两种写法:
1.
dt += func(d);
2.
dt += (*func)(d);
windcsn 2003-01-24
  • 打赏
  • 举报
回复
同意 chinajiji(菜鸟叽叽)
假设:
double(*func)(double);如此定义
对func和*func有两种说法:(其实这里的*func相当于没有*情况下的func)

1,认为,func是指针,那么*func是函数,因此(*func)()作为函数调用。
2,认为由于函数名是指向函数的指针,指向函数的指针的行为应与函数名相似,因此应将pf()作为函数调用。
但是现在的C++允许这两种操作
张灰太狼 2003-01-24
  • 打赏
  • 举报
回复
前者在必要的时候动态的分配存储空间
x2jack 2003-01-24
  • 打赏
  • 举报
回复
函数指针实际上是指向函数地址的指针,即通过此指针的初始化后可以用此指针调用函数。
ckacka 2003-01-24
  • 打赏
  • 举报
回复
呵呵,随手写的,好像不是很说明问题!

不过
double sigma(double(func)(double),double db,double de)
double sigma(double(*func)(double),double db,double de)
尽管结果相同,还是有一点点区别的,(*func)多了一级调用关系!

不要被if ( sizeof((**********ptr_foo)()) == sizeof(ptr_foo()) )
迷惑了,其实肯定是相等的,因为他们都仅仅是一个地址!

加上
int k = sizeof((**********ptr_foo)());
cout << k << endl;
看看,结果是4,因为4byte就是32bit
ckacka 2003-01-24
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int foo()
{
cout << "Hello!" <<endl;
return 1;
}

int (*ptr_foo)() = foo;

void main()
{
cout << "direct call foo() access itself:" << endl;
foo();
cout << endl;

int i = 1;
i += (**********ptr_foo)();
cout << i << endl;

int j = 1;
j += ptr_foo();
cout << j << endl;

if ( sizeof((**********ptr_foo)()) == sizeof(ptr_foo()) )
cout << "(**********ptr_foo)() == ptr_foo()" << endl;
else
cout << "(**********ptr_foo)() != ptr_foo()" << endl;

return;
}
Crystal_arrow 2003-01-24
  • 打赏
  • 举报
回复
有函数的指针,可以用其他的函数不一定要原来的

函数指针实际上就是指向函数的地址
widewave 2003-01-23
  • 打赏
  • 举报
回复
double sigma(double(func)(double),double db,double de)
能通过吗?
纪俊 2003-01-23
  • 打赏
  • 举报
回复
好像是函数的重载啊

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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