我在理解传递任何参数的函数指针时遇到问题。请找到示例程序供您参考。在这里,我想打印两个数字的总和。 print()接受函数指针作为其参数。但是我无法将参数从main()传递给函数。
#include<stdio.h>
int sum(int, int);
void print(int (*p)(int,int));
int main()
{
int a=2;
int b=5;
print(sum(a,b));
}
void print(int (*p)(int a,int b))
{
printf("%d",p(a,b)); //a and b are not defined as per compiler
}
int sum(int a, int b)
{
return a+b;
}
答案 0 :(得分:3)
进行此声明时
void print(int (*p)(int a,int b))
你声明一个函数print
,它接受一个函数指针p
,它需要两个int
并返回一个int
。名称a
和b
并不代表任何内容 - 编译器会忽略它们。事实上,你可以省略它们:
void print(int (*p)(int,int))
如果您想传递两个要添加的数字,请将它们作为单独的参数传递:
void print(int (*p)(int,int), int a, int b)
现在你的print
将会编译。电话会看起来像这样:
print(sum, a, b);
这是因为当您编写print(sum(a, b))
时,您正在指示编译器使用参数sum
和a
调用 b
,获取其结果,并传递给print
。但是,如果单独传递sum
,没有括号,则表示函数指针。
答案 1 :(得分:1)
程序看起来像
#include<stdio.h>
int sum( int, int );
void print( int ( * )( int, int ), int, int );
// or more simpler
void print( int ( int, int ), int, int );
int main()
{
int a = 2;
int b = 5;
print( sum, a, b);
}
void print( int ( *p )( int,int ), int a, int b )
{
printf( "%d", p( a, b ) ); //a and b are not defined as per compiler
}
int sum( int a, int b )
{
return a + b;
}
考虑到这些声明是等效的并且声明了相同的函数
void print( int ( * )( int, int ), int, int );
// or more simpler
void print( int ( int, int ), int, int );
对于原始代码,函数print只有一个参数:函数指针。所以你可以传递给函数print只有一个参数:一些函数。您可以通过以下方式定义功能打印
void print( int ( *p )( int,int ) )
{
int a = 2, b = 5;
printf( "%d", p( a, b ) ); //a and b are not defined as per compiler
}
或者您可以使用三个参数定义函数打印,函数的用户可以自己在打印体内指定被调用函数的参数。
void print( int ( *p )( int,int ), int a, int b )
{
printf( "%d", p( a, b ) ); //a and b are not defined as per compiler
}
答案 2 :(得分:0)
让我们从一个基本功能开始,我们将指向:
int addInt(int n, int m) {
return n+m;
}
首先,让我们定义一个指向函数的指针,该函数接收2个int并返回int:
int (*functionPtr)(int,int);
现在我们可以安全地指出我们的功能:
functionPtr = &addInt;
现在我们有了一个指向该函数的指针,让我们使用它:
int sum = (*functionPtr)(2, 3); // sum == 5
将指针传递给另一个函数基本相同:
int add2to3(int (*functionPtr)(int, int)) {
return (*functionPtr)(2, 3);
}
我们也可以在返回值中使用函数指针(尝试跟上,它会变得混乱):
// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}
但是使用typedef要好得多:
typedef int (*myFuncDef)(int, int);
// note that the typedef name is indeed myFuncDef
myFuncDef functionFactory(int n) {
printf("Got parameter %d", n);
myFuncDef functionPtr = &addInt;
return functionPtr;
}
免责声明:此代码未必编译,如果您发现任何错误,请随时编辑。