C语言 将函数名作为参数被另外一个函数调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 将函数名作为参数被另外一个函数调用相关的知识,希望对你有一定的参考价值。

函数 f1()中用函数f2作为参数,然后在f()中用形参函数f2调用实参函数。形式如
void f1(int f2)
f2;

int add()
int sub()
int main()

f1(add); //实际执行的是add函数
f1(sub); //实际执行的是sub函数

如何才能实行,可以用简单的几个函数给出说明,谢谢!高分重谢!

要将函数名作为参数,需要使用函数指针。

函数指针的定义格式为

ret_type (*var_name)(arg_list);

表示返回值为ret_type,参数列表为arg_list的函数指针var_name.

int (*p)(int,int);

表示返回值为int,参数为两个int型的函数指针p。

以函数指针作为形参,即可实现函数名作为参数,由另一个函数调用。


void func(int (*a)(int))

    int r = 100l;
    (*a)(r);

即可传入函数指针,并以r为参数,调用该指针指向的函数。

参考技术A 楼主已经开始想要知道如何用函数指针了,不错,好学生,给你个例子
#include <stdio.h>
int ff(int(*p)(int,int),int a,int b)//原始写法,阅读不便

return p(a,b);


typedef int(*Pfun)(int,int);//定义函数指针类型,同时申明了原型 返回int 两个int形参
int f(Pfun p,int a,int b) //改进写法 易懂

return p(a,b);

int add(int a,int b)

printf("加法函数add被调用:");
return a+b;

int sub(int a,int b)

printf("减法函数sub被调用:");
return a-b;

void main()
//函数指针初步应用
int a=1,b=2;
printf(" %d+%d=%d\n",a,b,f(add,a,b));
printf(" %d-%d=%d\n",a,b,f(sub,a,b));
printf(" %d+%d=%d\n",a,b,ff(add,a,b));
printf(" %d-%d=%d\n",a,b,ff(sub,a,b));

///////////运行结果:
加法函数add被调用: 1+2=3
减法函数sub被调用: 1-2=-1
加法函数add被调用: 1+2=3
减法函数sub被调用: 1-2=-1本回答被提问者和网友采纳
参考技术B 给你看个程序代码吧,功能是输入a、b,然后分别输出a+b,a-b,找我代码改就行~
我编译器是gcc,你要是vc6,稍微改下就ok~

#include <stdio.h>
typedef int (*FUNC)(int a, int b);

int add(int x, int y)
return x + y;


int sub(int x, int y)
return x - y;


int f(int x, int y, FUNC op)
return op(x, y);


int main()
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", f(a, b, add));
printf("%d\n", f(a, b, sub));
return 0;
参考技术C 函数名其实是函数指针,能用指针的地方就能用函数指针。
这里f1的原型应该是这样的才对
void f1(int (*f2)())//f2 是一个函数指针

f2();
参考技术D 用函数指针的方式实现
#include <stdio.h>
typedef void (*printFun)(void);
void printOK(void)

printf("OK\n");

void testfun(printFun Fun)

Fun();

int main()

testfun(printOK);
return 0;

javascript 函数作为参数名

以函数操作参数名,请问, 如果函数本身就有参数的, 那该如何传递?
请给出一个简单的例子
上面打错字了,
应该是: 以函数名作为参数,请问, 如果函数本身就有参数的, 那该如何传递?
如果,参数的个数是可变的,能实现吗?

你可以直接传递函数名作为参数,只是不要加括号


function funcOne(str)
    alert(str);

    
// 这里传过来 funcName 为 funcOne, param 为 funcOne 的参数
function funcTwo(funcName, param)
    // 等于调用 funcOne("hello")
    funcName(param);

    
// 调用 funcTwo 函数
// 将函数 funcOne 作为参数传递给 funcTwo
funcTwo(funcOne, "hello");

追问

如果,参数的个数是可变的,能实现吗?

追答

可以,在函数内使用 arguments 获取参数,然后使用 apply 调用函数

// 这里不需要填参数,因为在函数内可以使用 arguments 获取参数
function funcOne()
// 这里使用 arguments 获取全部参数
// 处理、、、arguments[0], arguments[1], arguments[2]
// 或者循环 arguments 进行处理


// 这里不需要填参数,因为在函数内可以使用 arguments 获取参数
function funcTwo()

// 参数 0 为函数名
var func = arguments[0];

// 剩余的参数为需要传递给 funcOne 的参数
var args = Array.prototype.slice.call(arguments, 1);

// 调用函数,并传递所有参数
func.apply(this, args);


// 这里的参数长度可以为任意,类型可以为任意
funcTwo(funcOne, "hello", "world", "foo", "bar");

参考技术A 函数作为参数有两种。。
第一种将涵数的返回值做为另一个涵数的参数。。看下面的例子
function demo(a,b)
return a+b;


function test(one)
return one+2;



//调用涵数demo 并且将test涵数的返回值作为demo涵数的第一个参数,
//在这里test涵数的返回值为:放5传到test涵数中去。返回值为7,再将7和8传到demo涵数中。
//返回值就为15

var result=demo(test(5),8);
alert(result); //弹出15

//第二种将涵数体作为另一个涵数的参数
function sum(a,b)
return a(b); //在这里如果第一个参数为涵数所以我们就可以直接把a当作一个涵数来处理


function one(n)
return n+10;



//调用sum涵数将涵数one作为sum涵数的第一个参数
var r=sum(one,10);
//这里one是sum的的参数,又是一涵数。。one涵数在sum涵数时的作用是处理sum涵数的第二个参数,sum涵数的结果所以会把10传到one涵数内返回。结果为20
alert(r); //弹出结果20
参考技术B 简单的举个例子。测试环境 win7+ie8+chrome
<script type="text/javascript">
function Add(x,y)
alert(x + y);

function Sub(x,y)
alert(x - y);

function CallFunc(Fun,x,y)
if (Fun && (typeof Fun == "function"))
if (x && y && (typeof x == "number") && (typeof y == "number"))
Fun(x,y);
else
console.log(typeof x);


else




CallFunc(Sub,5,3);
</script>追问

如果,参数的个数是可变的,能实现吗?

追答

可以用arguments来实现。

function Test()
for (var i = 0; i < arguments.length; i++)
alert(arguments[i]);



Test(1, 2, 3, 45, 6);

本回答被提问者和网友采纳
参考技术C

我的理解吧,把1个函数做参数就是把这个函数整体作为1个对象来用,而你的操作只是在主函数body中调用这个对象而已。我以前这么用是在做异步的时候需要在返回数据后调用方法,因为操作可能不一样,所以传函数,大致就如下面这个。

var fun1 = function(a,b)
    alert(a+b);

var fun = function(fun1)
    //此处你可以调用fun1
    fun1(1,2);

追问

如果,参数的个数是可变的,能实现吗?

追答

可以吧,我只知道,function(param1,param2,param3),类似这种多个参数的,你在调用时可以按顺序,只写其中几个参数或不写都可以调用的。如果是在fun1中参数不确定,你可以单独封装1个对象,把你的所有参数作为属性动态的赋给封装的那个对象,然后把封装的对象当参数传过去。

参考技术D 可以这样子:
function aaa(ar)
//这里是函数执行代码



传参这样传:
function bbb(aaa,ar) //aaa为上面的函数, ar为要为它传入的参数

aaa(ar); //执行aaa函数

追问

如果,参数的个数是可变的,能实现吗?

追答

什么都可以啊,关键是你aaa()函数里的代码怎么写,只要里面的代码没问题,那肯定没问题

以上是关于C语言 将函数名作为参数被另外一个函数调用的主要内容,如果未能解决你的问题,请参考以下文章

c语言中数组名作为函数参数

数组名作为函数的参数属于啥传递为啥

c语言中怎么用二维数组作为函数参数

【C 语言】数组元素和数组名作为函数参数

函数名作为参数传递与回调函数

数组名作为函数参数