回 帖 发 新 帖 刷新版面

主题:【新手求教】函数作函数参数的问题

输入两个数,通过三次调用fun()函数求其大者,小者,其和。代码如下:
#include<stdio.h>
#include<stdlib.h>

int max(int x,int y) //求大者 
{
    if(x<y) x=y;
    return(x);    
}

int min(int x,int y)  //求小者 
{
    if(x>y) x=y;
    return(x);    
}

int add(int x,int y)  //求和 
{
    return(x+y);
}

int fun(int x,int y,int (*f)(int x,int y))/* [color=008000] ①  [/color] */
{
    int r;
    r=(*f)(x,y);
    return(r);
}

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("max=%d  min=%d  add=%d\n",fun(a,b,max),fun(a,b,min),fun(a,b,add));
    system("pause");
}
上述代码中,绿色①处,函数指针(*f)(int x,int y)改成f(int x,int y)在dev-c++中也能编译运行。
问:1,函数可以直接作为函数参数吗?还是因编译器而异?
    2,如果可以,函数直接作为函数参数 与 函数指针做函数参数有什么区别?

回复列表 (共7个回复)

沙发

int fun(int x,int y,int (*f)(int x,int y))这句参数列表中的函数指针给出参数名x,y能编译通过?一般见的都是int fun( int x,int y,int (*f)(int,int) )

板凳

[quote]int fun(int x,int y,int (*f)(int x,int y))这句参数列表中的函数指针给出参数名x,y能编译通过?一般见的都是int fun( int x,int y,int (*f)(int,int) )[/quote]
能通过。

3 楼

1。你问的问题和“求其大者,小者,其和”没什么关系,所以你不应该将无关的代码贴出来
2。可以,没区别。

4 楼

[quote]1。你问的问题和“求其大者,小者,其和”没什么关系,所以你不应该将无关的代码贴出来
2。可以,没区别。[/quote]
谢谢告知。贴代码是因为问题是从这段代码中来的,第一次在论坛发帖,也没管什么有关没关了,下次知道了。再次感谢,呵呵。

5 楼


是不是可以这样理解:指向函数的指针和函数名都是表示函数的地址,两者没有什么区别?

6 楼

[quote]是不是可以这样理解:指向函数的指针和函数名都是表示函数的地址,两者没有什么区别?[/quote]
有区别。
1、函数名一定代表了一个函数,而“指向函数的指针”却可以是NULL,不指向任何一个函数。
2、函数名自始至终都代表同一个函数,而“指向函数的指针”则可以先指向一个函数,而后又指向另一个函数。
3、“指向函数的指针”可以指向一个函数,此时,这个指针的值就是它所指向的函数的地址。这个说法比较绕,但至少是正确的。而“指向函数的指针可以表示函数的地址”,听起来简短了,但它是错误的。“指向函数的指针可以保存一个函数的地址”,这是简短并且正确的说法。这个说法还有一个隐含的意思:“指向函数的指针也可以不保存任何一个函数的地址,此时它应该是NULL”。
4、函数的名字代表了函数,而不是代表函数的地址。
5、楼主的代码“fun(a,b,max)”虽然通过了编译,但最好是写成“fun(a,b,&max)”,表明是取max函数的地址。(如果楼主用C++而不是C语言的话,你会发现有些编译器更喜欢让你加上&符号。)
6、回答楼主的两个问题。(1) 函数从来都不能作为参数。 (2) 虽然修改之后也能编译运行,但实际上都是把指向函数的指针作为参数。写法变了,但是意思不变,执行效果也不变。

7 楼


谢谢指教,获益匪浅。

我来回复

您尚未登录,请登录后再回复。点此登录或注册