C语言中用函数做函数的形式参数的问题

如题所述

给你举个例子吧,这样就容易理解得多。
例子:设计一个函数func();在调用它时每次实现不同的函数功能,输入两个参数a和b,第一次调用func()时找出a和b中的较大者,第二次调用找出较小者,第三次调用求a和b之和。
说明:格式
(*p)()
表示定义一个指向函数的指针变量p,在c语言中这个格式是固定的,前面的()表示p先和*结合,是指针变量,后面的()表示p指向一个函数。前面的()不能省略,如果写成
*p(),由于()优先级比*高,那就表示p()函数返回的是一个指针,p本身就是函数不是指针了,意思完全变了。
任何一个函数,函数名就是该函数的入口地址(起始地址),也就是说函数名就是个地址,从这个地址开始,函数占用一段内存单元。因此可以用一个指针变量来指向这个这个函数名,这样就相当于指向这个函数了。所以下面的max,min,add函数都是一个地址,分别调用时就是赋值p=max,p=min,p=add,也就是(*p)(x,y)分别就等于max(x,y),min(x,y),add(x,y).
程序在win-tc和Dev-c++下调试通过。
#include
<stdio.h>
#include
<conio.h>
int
max(int
x,int
y)
{
return(x>y?x:y);
}
int
min(int
x,int
y)
{
return(x<y?x:y);
}
int
add(int
x,int
y)
{
return(x+y);
}
int
func(int
x,int
y,int
(*p)())
/*定义指向函数的指针变量p,关键1*/
{int
result;
result=(*p)(x,y);
/*调用相应函数,函数名即地址给p,这样p指向该函数,关键2*/
printf("%d\n",result);
}
main()
{
int
a,b;
printf("Please
input
two
integers
a
and
b:\n");
scanf("%d%d",&a,&b);
printf("max=");
func(a,b,max);/*相当于赋值p=max*/
printf("min=");
func(a,b,min);/*相当于赋值p=min*/
printf("add=");
func(a,b,add);/*相当于赋值p=add*/
getch();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-11-23
可以使用函数指针,比如:
void
function(int
x,void
(*visit)())/*没有返回值,没有参数*/
{
/*其他代码*/
visit();
}
void
function(int
x,void
(*visit)(int))/*没有返回值,有整形参数*/
{
int
y
=
x*x;
/*其他代码*/
visit(y);
}
第2个回答  2019-09-18
用函数指针应该能解决吧,以下是我写的一个例子,TC编译通过:
int
test1(int
i)
{
return
i;
}
int
test2(int
a,int
(*fp)(int
a))
{
return
fp(a);
}
main()
{
printf("%d",test2(5,test1));
getch();
}

C语言中用函数做函数的形式参数的问题
表示定义一个指向函数的指针变量p,在c语言中这个格式是固定的,前面的()表示p先和*结合,是指针变量,后面的()表示p指向一个函数。前面的()不能省略,如果写成 p(),由于()优先级比*高,那就表示p()函数返回的是一个指针,p本身就是函数不是指针了,意思完全变了。任何一个函数,函数名就是该...

问个关于C语言中函数形式参数的问题
1)const使用的基本形式: const type m;限定m不可变。2)替换基本形式中的m为1式中的*p1,替换后const char *p1;限定*p1不可变,当然p1是可变的,因此问题中p1++是对的。3)替换基本形式中的type为2式中的pStr,替换后const pStr m;限定m不可变,题中的pStr就是一种新类型,因此问题中p2不...

c语言中数组名为函数实参的问题?
代码在编译时会出现 error C2664: 'InsertSort' : cannot convert parameter 1 from 'int' to 'int []'这是因为用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素地址,因此对参数的类型做一下改变,如下图所示:

简述C语言中函数的形式参数定义时的注意事项 求解...
1、形参个数不能太多,多了就用结构体指针吧;2、不需要携带数据返回的放在前面,需要携带数据返回类型的放在后面吧;3、不要直接传递结构体哦;4、一般地,指针类型最好加上const修饰,除非有特殊用途;5、尽量不要使用bool类型做为形式参数;6、别忘了给一个简洁好听的名字 ...

C语言中函数定义形参为数组时的问题
1.数组为参数传递的是数组首地址,而不是元素的值,而你说的a[size]仅仅是值,况且事实上也没有a[size]这个元素 2.既然是数组名的传递,当然需要由一个数组的参数来接收,int v[]”的问题是因为他是形式参数,是为了接收数组的 n的问题是因为,如果只传递了数组,但是函数并找不到数组的个数,所以需要...

c语言关于实参形参表示的方式的问题
1,形参前面加了void是空函数 意思是不要求返回值么?那这题不是把声明部分全部返还了么?增加void表示不用返回值,即在函数中要使用return时,不用带值。比如返回值为int型,那么要用类似return 0;,而本例直接return;即可。void inv(int x[ ],int n)中x,n都是传入参数,x是数组,所以函数内...

C语言函数的参数的问题
主函数也就是main函数 一般是没有参数的。函数可以分为两类,带参数和不带参数的,参数的作用就是值传递。一般都是在主函数中调用子函数,由实参传递给形参,形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。 形参的作用是实现主调函数与被调...

C语言函数的调用函数名后面的形式参数表列可以是数字常量吗
函数名后面的形式参数表列不可以是常量!C语言中函数有三个概念:定义 声明 调用 函数定义:自定义一个函数,并完成相应的代码实现,如:int max( int a, int b ) \/\/小括号中的 a, b被称为形参,用来对应相应的实参,因为这里的形参可对应任意的实参值,所以,必须以变量形式体现。{ return ...

c语言函数调用时,实参和形参是如何传递的?什么时候要写指针型变量?求高...
函数调用时,实参值会自动传递给形参变量。指针比较复杂了。是变量的地址,如果参数类型是指针类型,则必须把实参变量的地址传递过去。当然在函数内也是间接引用实参变量的。比如 void f(int * p) \/\/形参是指针类型变量 下面是调用形式 f(&a); \/\/调用函数,实参是变量a的地址。

c语言中用函数做参数怎么用
} return 0;} 本程序中首先定义一个无返回值函数nzp,并说明其形参v为整型变量。在函数体中根据v值输出相应的结果。在main函数中用一个for语句输入数组各元素,每输入一个就以该元素作实参调用一次nzp函数,即把a[i]的值传送给形参v,供nzp函数使用。数组名作为函数参数 用数组名作函数参数与用...

相似回答